mkoppanen               Fri Oct  3 13:32:42 2008 UTC

  Modified files:              (Branch: PHP_5_3)
    /php-src/ext/standard       mail.c 
  Log:
  Adds signal handling around popen/pclose in mail.c.
  Related information on bugs #8992 and #14032
  Original patch by D. Parthey
  
  
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/mail.c?r1=1.87.2.1.2.7.2.3&r2=1.87.2.1.2.7.2.4&diff_format=u
Index: php-src/ext/standard/mail.c
diff -u php-src/ext/standard/mail.c:1.87.2.1.2.7.2.3 
php-src/ext/standard/mail.c:1.87.2.1.2.7.2.4
--- php-src/ext/standard/mail.c:1.87.2.1.2.7.2.3        Mon Dec 31 07:17:15 2007
+++ php-src/ext/standard/mail.c Fri Oct  3 13:32:41 2008
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: mail.c,v 1.87.2.1.2.7.2.3 2007/12/31 07:17:15 sebastian Exp $ */
+/* $Id: mail.c,v 1.87.2.1.2.7.2.4 2008/10/03 13:32:41 mkoppanen Exp $ */
 
 #include <stdlib.h>
 #include <ctype.h>
@@ -31,6 +31,12 @@
 #include <sys/sysexits.h>
 #endif
 
+#if PHP_SIGCHILD
+#if HAVE_SIGNAL_H
+#include <signal.h>
+#endif
+#endif
+
 #include "php_mail.h"
 #include "php_ini.h"
 #include "safe_mode.h"
@@ -193,6 +199,9 @@
        int ret;
        char *sendmail_path = INI_STR("sendmail_path");
        char *sendmail_cmd = NULL;
+#if PHP_SIGCHILD
+       void (*sig_handler)() = NULL;
+#endif
 
        if (!sendmail_path) {
 #if (defined PHP_WIN32 || defined NETWARE)
@@ -217,6 +226,16 @@
                sendmail_cmd = sendmail_path;
        }
 
+#if PHP_SIGCHILD
+       /* Set signal handler of SIGCHLD to default to prevent other signal 
handlers
+        * from being called and reaping the return code when our child exits.
+        * The original handler needs to be restored after pclose() */
+       sig_handler = (void *)signal(SIGCHLD, SIG_DFL);
+       if (sig_handler == SIG_ERR) {
+               sig_handler = NULL;
+       }
+#endif
+
 #ifdef PHP_WIN32
        sendmail = popen(sendmail_cmd, "wb");
 #else
@@ -235,6 +254,13 @@
                if (EACCES == errno) {
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Permission 
denied: unable to execute shell to run mail delivery binary '%s'", 
sendmail_path);
                        pclose(sendmail);
+#if PHP_SIGCHILD
+                       /* Restore handler in case of error on Windows
+                          Not sure if this applicable on Win but just in case. 
*/
+                       if (sig_handler) {
+                               signal(SIGCHLD, sig_handler);
+                       }
+#endif
                        return 0;
                }
 #endif
@@ -246,6 +272,12 @@
                fprintf(sendmail, "\n%s\n", message);
                ret = pclose(sendmail);
 
+#if PHP_SIGCHILD
+               if (sig_handler) {
+                       signal(SIGCHLD, sig_handler);
+               }
+#endif
+
 #ifdef PHP_WIN32
                if (ret == -1)
 #else
@@ -264,6 +296,11 @@
                }
        } else {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not execute 
mail delivery program '%s'", sendmail_path);
+#if PHP_SIGCHILD
+               if (sig_handler) {
+                       signal(SIGCHLD, sig_handler);                           
                
+               }
+#endif
                return 0;
        }
 



-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to