cvs: php-src /ext/standard mail.c
| From: | Mikko Koppanen | Date: | Fri, 03 Oct 2008 13:31:21 +0000 |
| Subject: | cvs: php-src /ext/standard mail.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-53341@lists.php.net to get a copy of this message | ||
mkoppanen Fri Oct 3 13:31:21 2008 UTC
Modified files:
/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.97&r2=1.98&diff_format=u
Index: php-src/ext/standard/mail.c
diff -u php-src/ext/standard/mail.c:1.97 php-src/ext/standard/mail.c:1.98
--- php-src/ext/standard/mail.c:1.97 Mon Dec 31 07:12:16 2007
+++ php-src/ext/standard/mail.c Fri Oct 3 13:31:21 2008
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: mail.c,v 1.97 2007/12/31 07:12:16 sebastian Exp $ */
+/* $Id: mail.c,v 1.98 2008/10/03 13:31:21 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 "exec.h"
@@ -187,6 +193,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)
@@ -211,6 +220,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
@@ -229,6 +248,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
@@ -240,6 +266,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
@@ -258,6 +290,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;
}