From 4273a9b4dc6fff2e8898737c8eedfd8132c93bc7 Mon Sep 17 00:00:00 2001 From: Mikko Koppanen Date: Fri, 3 Oct 2008 13:59:33 +0000 Subject: [PATCH] Adds signal handling around popen/pclose in mail.c. Related information on bugs #8992 and #14032 Original patch by D. Parthey --- NEWS | 2 ++ ext/standard/mail.c | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/NEWS b/NEWS index 33c1832554..e9b06b3974 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,8 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2008, PHP 5.2.7 +- Fixed bug #14032 (Mail() always returns false but mail is sent). (Mikko) + - Reverted fix for bug #44197 due to behaviour change in minor version. (Felipe) diff --git a/ext/standard/mail.c b/ext/standard/mail.c index 6ad3bbeb2d..5acf1f0c80 100644 --- a/ext/standard/mail.c +++ b/ext/standard/mail.c @@ -31,6 +31,12 @@ #include #endif +#if PHP_SIGCHILD +#if HAVE_SIGNAL_H +#include +#endif +#endif + #include "php_mail.h" #include "php_ini.h" #include "safe_mode.h" @@ -200,6 +206,9 @@ PHPAPI int php_mail(char *to, char *subject, char *message, char *headers, char 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) @@ -224,6 +233,16 @@ PHPAPI int php_mail(char *to, char *subject, char *message, char *headers, char 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 @@ -241,6 +260,13 @@ PHPAPI int php_mail(char *to, char *subject, char *message, char *headers, char 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 @@ -251,6 +277,12 @@ PHPAPI int php_mail(char *to, char *subject, char *message, char *headers, char } 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 @@ -269,6 +301,11 @@ PHPAPI int php_mail(char *to, char *subject, char *message, char *headers, char } } 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; } -- 2.50.1