]> granicus.if.org Git - php/commitdiff
Fix #47983: mixed LF and CRLF line endings in mail()
authorChristoph M. Becker <cmbecker69@gmx.de>
Thu, 2 Apr 2020 11:06:19 +0000 (13:06 +0200)
committerChristoph M. Becker <cmbecker69@gmx.de>
Thu, 2 Apr 2020 12:51:14 +0000 (14:51 +0200)
Email headers are supposed to be separated with CRLF.  Period.

NEWS
ext/standard/mail.c
ext/standard/tests/mail/bug47983.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 83ef93e59dec6abe43b162a5f5af61dfc114917e..24608bdd5debbc063f6d6651cb60491fb07b0bb9 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -125,6 +125,7 @@ PHP                                                                        NEWS
     is the last char). (Islam Israfilov)
   . Fixed bug #75902 (str_replace should warn when misused with nested arrays).
     (Nikita)
+  . Fixed bug #47983 (mixed LF and CRLF line endings in mail()). (cmb)
   . Made quoting of cmd execution functions consistent. (cmb)
 
 - tidy:
index d08325c3fa200a1d0cdeedec5558212cdbb27f53..096f432c9a207f3bfdef15aabeac20c2bcdb6e28 100644 (file)
@@ -486,7 +486,7 @@ PHPAPI int php_mail(char *to, char *subject, char *message, char *headers, char
                f = php_basename(tmp, strlen(tmp), NULL, 0);
 
                if (headers != NULL && *headers) {
-                       spprintf(&hdr, 0, "X-PHP-Originating-Script: " ZEND_LONG_FMT ":%s\n%s", php_getuid(), ZSTR_VAL(f), headers);
+                       spprintf(&hdr, 0, "X-PHP-Originating-Script: " ZEND_LONG_FMT ":%s\r\n%s", php_getuid(), ZSTR_VAL(f), headers);
                } else {
                        spprintf(&hdr, 0, "X-PHP-Originating-Script: " ZEND_LONG_FMT ":%s", php_getuid(), ZSTR_VAL(f));
                }
@@ -559,12 +559,12 @@ PHPAPI int php_mail(char *to, char *subject, char *message, char *headers, char
                        MAIL_RET(0);
                }
 #endif
-               fprintf(sendmail, "To: %s\n", to);
-               fprintf(sendmail, "Subject: %s\n", subject);
+               fprintf(sendmail, "To: %s\r\n", to);
+               fprintf(sendmail, "Subject: %s\r\n", subject);
                if (hdr != NULL) {
-                       fprintf(sendmail, "%s\n", hdr);
+                       fprintf(sendmail, "%s\r\n", hdr);
                }
-               fprintf(sendmail, "\n%s\n", message);
+               fprintf(sendmail, "\r\n%s\r\n", message);
                ret = pclose(sendmail);
 
 #if PHP_SIGCHILD
diff --git a/ext/standard/tests/mail/bug47983.phpt b/ext/standard/tests/mail/bug47983.phpt
new file mode 100644 (file)
index 0000000..f908ca6
--- /dev/null
@@ -0,0 +1,17 @@
+--TEST--
+Bug #47983 (mixed LF and CRLF line endings in mail())
+--INI--
+sendmail_path={MAIL:bug47983.out}
+--FILE--
+<?php
+var_dump(mail('user@example.com', 'Test Subject', 'A Message', 'KHeaders'));
+$mail = file_get_contents('bug47983.out');
+var_dump(preg_match_all('/(?<!\r)\n/', $mail));
+?>
+--CLEAN--
+<?php
+unlink('bug47983.out');
+?>
+--EXPECT--
+bool(true)
+int(0)