diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index a5284264f3d34..48f22a682a196 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -3270,6 +3270,8 @@ PHP_FUNCTION(mb_decode_numericentity) continue; \ } +#define CRLF "\r\n" + static int _php_mbstr_parse_mail_headers(HashTable *ht, const char *str, size_t str_len) { const char *ps; @@ -3601,7 +3603,7 @@ PHP_FUNCTION(mb_send_mail) || orig_str.encoding->no_encoding == mbfl_no_encoding_pass) { orig_str.encoding = mbfl_identify_encoding(&orig_str, MBSTRG(current_detect_order_list), MBSTRG(current_detect_order_list_size), MBSTRG(strict_detection)); } - pstr = mbfl_mime_header_encode(&orig_str, &conv_str, tran_cs, head_enc, "\n", sizeof("Subject: [PHP-jp nnnnnnnn]")); + pstr = mbfl_mime_header_encode(&orig_str, &conv_str, tran_cs, head_enc, CRLF, sizeof("Subject: [PHP-jp nnnnnnnn]" CRLF) - 1); if (pstr != NULL) { subject_buf = subject = (char *)pstr->val; } @@ -3640,14 +3642,14 @@ PHP_FUNCTION(mb_send_mail) n = ZSTR_LEN(str_headers); mbfl_memory_device_strncat(&device, p, n); if (n > 0 && p[n - 1] != '\n') { - mbfl_memory_device_strncat(&device, "\n", 1); + mbfl_memory_device_strncat(&device, CRLF, sizeof(CRLF)-1); } zend_string_release_ex(str_headers, 0); } if (!zend_hash_str_exists(&ht_headers, "MIME-VERSION", sizeof("MIME-VERSION") - 1)) { mbfl_memory_device_strncat(&device, PHP_MBSTR_MAIL_MIME_HEADER1, sizeof(PHP_MBSTR_MAIL_MIME_HEADER1) - 1); - mbfl_memory_device_strncat(&device, "\n", 1); + mbfl_memory_device_strncat(&device, CRLF, sizeof(CRLF)-1); } if (!suppressed_hdrs.cnt_type) { @@ -3658,7 +3660,7 @@ PHP_FUNCTION(mb_send_mail) mbfl_memory_device_strncat(&device, PHP_MBSTR_MAIL_MIME_HEADER3, sizeof(PHP_MBSTR_MAIL_MIME_HEADER3) - 1); mbfl_memory_device_strcat(&device, p); } - mbfl_memory_device_strncat(&device, "\n", 1); + mbfl_memory_device_strncat(&device, CRLF, sizeof(CRLF)-1); } if (!suppressed_hdrs.cnt_trans_enc) { mbfl_memory_device_strncat(&device, PHP_MBSTR_MAIL_MIME_HEADER4, sizeof(PHP_MBSTR_MAIL_MIME_HEADER4) - 1); @@ -3667,9 +3669,10 @@ PHP_FUNCTION(mb_send_mail) p = "7bit"; } mbfl_memory_device_strcat(&device, p); - mbfl_memory_device_strncat(&device, "\n", 1); + mbfl_memory_device_strncat(&device, CRLF, sizeof(CRLF)-1); } + mbfl_memory_device_unput(&device); mbfl_memory_device_unput(&device); mbfl_memory_device_output('\0', &device); str_headers = zend_string_init((char *)device.buffer, strlen((char *)device.buffer), 0); @@ -3707,6 +3710,7 @@ PHP_FUNCTION(mb_send_mail) } #undef SKIP_LONG_HEADER_SEP_MBSTRING +#undef CRLF #undef MAIL_ASCIIZ_CHECK_MBSTRING #undef PHP_MBSTR_MAIL_MIME_HEADER1 #undef PHP_MBSTR_MAIL_MIME_HEADER2 diff --git a/ext/mbstring/tests/gh7902.phpt b/ext/mbstring/tests/gh7902.phpt new file mode 100644 index 0000000000000..d9a0fced7913d --- /dev/null +++ b/ext/mbstring/tests/gh7902.phpt @@ -0,0 +1,32 @@ +--TEST-- +GH-7902 (mb_send_mail may delimit headers with LF only) +--SKIPIF-- + +--INI-- +sendmail_path={MAIL:{PWD}/gh7902.eml} +--FILE-- + +--CLEAN-- + +--EXPECT-- +int(0)