bug in mail()
| From: | Oliver Teuber | Date: | Fri, 16 Jun 2000 17:05:32 +0000 |
| Subject: | bug in mail() | ||
| Groups: | php.dev | ||
| Request: | Send a blank email to php-dev+get-21542@lists.php.net to get a copy of this message | ||
Hi
today i noticed that mail() does the wrong thing
with the sendmail exit codes ...
here is a patch for php 3.0.16 to fix that.
same problem exists in php 4.0
yours, oliver teuber
p.s. pleas cc me because i am not on this list
*** basic_functions.c.orig Fri Jun 16 18:48:36 2000
--- basic_functions.c Fri Jun 16 18:48:04 2000
***************
*** 2020,2026 ****
case 1: /*send an email*/
{
#if HAVE_SENDMAIL
! if (!_php3_mail(opt,"PHP3 error_log message",message,headers)){
return FAILURE;
}
#else
--- 2020,2027 ----
case 1: /*send an email*/
{
#if HAVE_SENDMAIL
! int dummy;
! if (!_php3_mail(opt,"PHP3 error_log message",message,headers,&dummy)){
return FAILURE;
}
#else
*** mail.c.orig Fri Jun 16 17:57:06 2000
--- mail.c Fri Jun 16 18:57:22 2000
***************
*** 24,29 ****
--- 24,31 ----
| contact core@php.net. |
+----------------------------------------------------------------------+
| Authors: |
+ | 06.2000: Fixed sendmail error reporting BUG! Oliver Teuber |
+ | ot@penguin-power.de |
| |
+----------------------------------------------------------------------+
*/
***************
*** 34,39 ****
--- 36,42 ----
#include <ctype.h>
#include <stdio.h>
#include "php.h"
+ #include <sysexits.h>
#ifndef MSVC5
#include "build-defs.h"
#endif
***************
*** 71,77 ****
{
pval *argv[4];
char *to=NULL, *message=NULL, *headers=NULL, *subject=NULL;
! int argc;
TLS_VARS;
argc = ARG_COUNT(ht);
--- 74,80 ----
{
pval *argv[4];
char *to=NULL, *message=NULL, *headers=NULL, *subject=NULL;
! int argc, err;
TLS_VARS;
argc = ARG_COUNT(ht);
***************
*** 111,125 ****
headers = argv[3]->value.str.val;
}
! if (_php3_mail(to, subject, message, headers)){
! RETURN_TRUE;
! } else {
RETURN_FALSE;
}
}
/* }}} */
! int _php3_mail(char *to, char *subject, char *message, char *headers)
{
#if MSVC5
int tsm_err;
--- 114,189 ----
headers = argv[3]->value.str.val;
}
! if(_php3_mail(to, subject, message, headers, &err))
! {
! switch(err)
! {
! case EX_OK:
! RETURN_TRUE;
! break;
!
! #ifdef EX_NOUSER
! case EX_NOUSER:
! php3_error(E_WARNING, "User name not recognized.");
! RETURN_FALSE;
! break;
! #endif
!
! #ifdef EX_UNAVAILABLE
! case EX_UNAVAILABLE:
! php3_error(E_WARNING, "Necessary resources were not available.");
! RETURN_FALSE;
! break;
! #endif
!
! #ifdef EX_SYNTAX
! case EX_SYNTAX:
! php3_error(E_WARNING, "Syntax error in address.");
! RETURN_FALSE;
! break;
! #endif
!
! #ifdef EX_SOFTWARE
! case EX_SOFTWARE:
! php3_error(E_WARNING, "Internal sendmail error.");
! RETURN_FALSE;
! break;
! #endif
!
! #ifdef EX_OSERR
! case EX_OSERR:
! php3_error(E_WARNING, "Temporary operating system error.");
! RETURN_FALSE;
! break;
! #endif
!
! #ifdef EX_NOHOST
! case EX_NOHOST:
! php3_error(E_WARNING, "Host name not recognized.");
! RETURN_FALSE;
! break;
! #endif
!
! #ifdef EX_TEMPFAIL
! case EX_TEMPFAIL:
! php3_error(E_WARNING, "Message could not be sent immediately, but was queued.");
! RETURN_TRUE;
! break;
! #endif
!
! default:
! php3_error(E_WARNING, "Unkown sendmail error code %d.",err);
! RETURN_FALSE;
! }
! }
! else
! {
RETURN_FALSE;
}
}
/* }}} */
! int _php3_mail(char *to, char *subject, char *message, char *headers, int *err)
{
#if MSVC5
int tsm_err;
***************
*** 134,139 ****
--- 198,204 ----
php3_error(E_WARNING, GetSMErrorText(tsm_err));
return 0;
}
+ return 1;
#else
if (!php3_ini.sendmail_path) {
return 0;
***************
*** 147,164 ****
fprintf(sendmail, "%s\n", headers);
}
fprintf(sendmail, "\n%s\n", message);
! ret = pclose(sendmail);
! if (ret == -1) {
! return 0;
! } else {
return 1;
}
} else {
php3_error(E_WARNING, "Could not execute mail delivery program");
return 0;
}
#endif
- return 1;
}
void php3_info_mail(void)
--- 212,248 ----
fprintf(sendmail, "%s\n", headers);
}
fprintf(sendmail, "\n%s\n", message);
!
! ret=pclose(sendmail);
!
! if(WIFEXITED(ret))
! {
! *err=WEXITSTATUS(ret);
return 1;
}
+ else
+ if(WIFSIGNALED(ret))
+ {
+ php3_error(E_WARNING, "Sendmail terminated by not cought signal %d!",WTERMSIG(ret));
+ return 0;
+ }
+ else
+ if(WIFSTOPPED(ret))
+ {
+ php3_error(E_WARNING, "Sendmail stopped by signal %d!",WSTOPSIG(ret));
+ return 0;
+ }
+
+ /* We should never reach this ... */
+ php3_error(E_WARNING, "Unkown returncode from sendmail");
+ return 0;
+
+
} else {
php3_error(E_WARNING, "Could not execute mail delivery program");
return 0;
}
#endif
}
void php3_info_mail(void)
*** php3_mail.h.orig Fri Jun 16 18:45:44 2000
--- php3_mail.h Fri Jun 16 18:46:03 2000
***************
*** 38,44 ****
extern void php3_mail(INTERNAL_FUNCTION_PARAMETERS);
extern void php3_info_mail(void);
! extern int _php3_mail(char *to, char *subject, char *message, char *headers);
#else
#define mail_module_ptr NULL
--- 38,44 ----
extern void php3_mail(INTERNAL_FUNCTION_PARAMETERS);
extern void php3_info_mail(void);
! extern int _php3_mail(char *to, char *subject, char *message, char *headers, int *stat);
#else
#define mail_module_ptr NULL