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