@@ -4160,7 +4160,7 @@ PHP_FUNCTION(mb_send_mail)
41604160 zend_string * extra_cmd = NULL ;
41614161 HashTable * headers_ht = NULL ;
41624162 zend_string * str_headers = NULL ;
4163- size_t n , i ;
4163+ size_t i ;
41644164 char * to_r = NULL ;
41654165 char * force_extra_parameters = INI_STR ("mail.force_extra_parameters" );
41664166 struct {
@@ -4175,15 +4175,12 @@ PHP_FUNCTION(mb_send_mail)
41754175 const mbfl_encoding * tran_cs , /* transfer text charset */
41764176 * head_enc , /* header transfer encoding */
41774177 * body_enc ; /* body transfer encoding */
4178- mbfl_memory_device device ; /* automatic allocateable buffer for additional header */
41794178 const mbfl_language * lang ;
41804179 int err = 0 ;
41814180 HashTable ht_headers ;
41824181 zval * s ;
4183- extern void mbfl_memory_device_unput (mbfl_memory_device * device );
41844182
41854183 /* initialize */
4186- mbfl_memory_device_init (& device , 0 , 0 );
41874184 mbfl_string_init (& orig_str );
41884185 mbfl_string_init (& conv_str );
41894186
@@ -4343,47 +4340,59 @@ PHP_FUNCTION(mb_send_mail)
43434340#define PHP_MBSTR_MAIL_MIME_HEADER2 "Content-Type: text/plain"
43444341#define PHP_MBSTR_MAIL_MIME_HEADER3 "; charset="
43454342#define PHP_MBSTR_MAIL_MIME_HEADER4 "Content-Transfer-Encoding: "
4343+
4344+ smart_str str = {0 };
4345+ bool empty = true;
4346+
43464347 if (str_headers != NULL ) {
4347- p = ZSTR_VAL (str_headers );
4348- n = ZSTR_LEN (str_headers );
4349- mbfl_memory_device_strncat (& device , p , n );
4350- if (n > 0 && p [n - 1 ] != '\n' ) {
4351- mbfl_memory_device_strncat (& device , line_sep , line_sep_len );
4348+ /* Strip trailing CRLF from `str_headers`; we will add CRLF back if necessary */
4349+ size_t len = ZSTR_LEN (str_headers );
4350+ if (ZSTR_VAL (str_headers )[len - 1 ] == '\n' ) {
4351+ len -- ;
4352+ }
4353+ if (ZSTR_VAL (str_headers )[len - 1 ] == '\r' ) {
4354+ len -- ;
43524355 }
4356+ smart_str_appendl (& str , ZSTR_VAL (str_headers ), len );
4357+ empty = false;
43534358 zend_string_release_ex (str_headers , 0 );
43544359 }
43554360
43564361 if (!zend_hash_str_exists (& ht_headers , "mime-version" , sizeof ("mime-version" ) - 1 )) {
4357- mbfl_memory_device_strncat (& device , PHP_MBSTR_MAIL_MIME_HEADER1 , sizeof (PHP_MBSTR_MAIL_MIME_HEADER1 ) - 1 );
4358- mbfl_memory_device_strncat (& device , line_sep , line_sep_len );
4362+ if (!empty ) {
4363+ smart_str_appendl (& str , line_sep , line_sep_len );
4364+ }
4365+ smart_str_appendl (& str , PHP_MBSTR_MAIL_MIME_HEADER1 , sizeof (PHP_MBSTR_MAIL_MIME_HEADER1 ) - 1 );
4366+ empty = false;
43594367 }
43604368
43614369 if (!suppressed_hdrs .cnt_type ) {
4362- mbfl_memory_device_strncat (& device , PHP_MBSTR_MAIL_MIME_HEADER2 , sizeof (PHP_MBSTR_MAIL_MIME_HEADER2 ) - 1 );
4370+ if (!empty ) {
4371+ smart_str_appendl (& str , line_sep , line_sep_len );
4372+ }
4373+ smart_str_appendl (& str , PHP_MBSTR_MAIL_MIME_HEADER2 , sizeof (PHP_MBSTR_MAIL_MIME_HEADER2 ) - 1 );
43634374
43644375 p = (char * )mbfl_encoding_preferred_mime_name (tran_cs );
43654376 if (p != NULL ) {
4366- mbfl_memory_device_strncat ( & device , PHP_MBSTR_MAIL_MIME_HEADER3 , sizeof (PHP_MBSTR_MAIL_MIME_HEADER3 ) - 1 );
4367- mbfl_memory_device_strcat ( & device , p );
4377+ smart_str_appendl ( & str , PHP_MBSTR_MAIL_MIME_HEADER3 , sizeof (PHP_MBSTR_MAIL_MIME_HEADER3 ) - 1 );
4378+ smart_str_appends ( & str , p );
43684379 }
4369- mbfl_memory_device_strncat ( & device , line_sep , line_sep_len ) ;
4380+ empty = false ;
43704381 }
4382+
43714383 if (!suppressed_hdrs .cnt_trans_enc ) {
4372- mbfl_memory_device_strncat (& device , PHP_MBSTR_MAIL_MIME_HEADER4 , sizeof (PHP_MBSTR_MAIL_MIME_HEADER4 ) - 1 );
4384+ if (!empty ) {
4385+ smart_str_appendl (& str , line_sep , line_sep_len );
4386+ }
4387+ smart_str_appendl (& str , PHP_MBSTR_MAIL_MIME_HEADER4 , sizeof (PHP_MBSTR_MAIL_MIME_HEADER4 ) - 1 );
43734388 p = (char * )mbfl_encoding_preferred_mime_name (body_enc );
43744389 if (p == NULL ) {
43754390 p = "7bit" ;
43764391 }
4377- mbfl_memory_device_strcat (& device , p );
4378- mbfl_memory_device_strncat (& device , line_sep , line_sep_len );
4392+ smart_str_appends (& str , p );
43794393 }
43804394
4381- if (!PG (mail_mixed_lf_and_crlf )) {
4382- mbfl_memory_device_unput (& device );
4383- }
4384- mbfl_memory_device_unput (& device );
4385- mbfl_memory_device_output ('\0' , & device );
4386- str_headers = zend_string_init ((char * )device .buffer , strlen ((char * )device .buffer ), 0 );
4395+ str_headers = smart_str_extract (& str );
43874396
43884397 if (force_extra_parameters ) {
43894398 extra_cmd = php_escape_shell_cmd (force_extra_parameters );
@@ -4404,7 +4413,6 @@ PHP_FUNCTION(mb_send_mail)
44044413 efree ((void * )subject_buf );
44054414 }
44064415 zend_string_free (conv );
4407- mbfl_memory_device_clear (& device );
44084416 zend_hash_destroy (& ht_headers );
44094417 if (str_headers ) {
44104418 zend_string_release_ex (str_headers , 0 );
0 commit comments