@@ -494,7 +494,27 @@ PHPAPI bool php_mail(const char *to, const char *subject, const char *message, c
494494 MAIL_RET (false);
495495 }
496496
497- char * line_sep = PG (mail_mixed_lf_and_crlf ) ? "\n" : "\r\n" ;
497+ char * line_sep ;
498+ const char * cr_lf_mode = PG (mail_cr_lf_mode );
499+
500+ if (cr_lf_mode && strcmp (cr_lf_mode , "crlf" ) != 0 ) {
501+ if (strcmp (cr_lf_mode , "lf" ) == 0 ) {
502+ line_sep = "\n" ;
503+ } else if (strcmp (cr_lf_mode , "mixed" ) == 0 ) {
504+ line_sep = "\n" ;
505+ } else if (strcmp (cr_lf_mode , "os" ) == 0 ) {
506+ #ifdef PHP_WIN32
507+ line_sep = "\r\n" ;
508+ #else
509+ line_sep = "\n" ;
510+ #endif
511+ } else {
512+ ZEND_ASSERT (0 && "Unexpected cr_lf_mode value" );
513+ }
514+ } else {
515+ /* CRLF is default mode, but respect mail.mixed_lf_and_crlf for backward compatibility */
516+ line_sep = PG (mail_mixed_lf_and_crlf ) ? "\n" : "\r\n" ;
517+ }
498518
499519 if (PG (mail_x_header )) {
500520 const char * tmp = zend_get_executed_filename ();
@@ -586,7 +606,43 @@ PHPAPI bool php_mail(const char *to, const char *subject, const char *message, c
586606 if (hdr != NULL ) {
587607 fprintf (sendmail , "%s%s" , hdr , line_sep );
588608 }
589- fprintf (sendmail , "%s%s%s" , line_sep , message , line_sep );
609+
610+ fprintf (sendmail , "%s" , line_sep );
611+
612+ if (cr_lf_mode && strcmp (cr_lf_mode , "lf" ) == 0 ) {
613+ char * converted_message = NULL ;
614+ size_t msg_len = strlen (message );
615+ size_t new_len = 0 ;
616+
617+ for (size_t i = 0 ; i < msg_len - 1 ; ++ i ) {
618+ if (message [i ] == '\r' && message [i + 1 ] == '\n' ) {
619+ ++ new_len ;
620+ }
621+ }
622+
623+ if (new_len == 0 ) {
624+ fprintf (sendmail , "%s" , message );
625+ } else {
626+ converted_message = emalloc (msg_len - new_len + 1 );
627+ size_t j = 0 ;
628+ for (size_t i = 0 ; i < msg_len ; ++ i ) {
629+ if (i < msg_len - 1 && message [i ] == '\r' && message [i + 1 ] == '\n' ) {
630+ converted_message [j ++ ] = '\n' ;
631+ ++ i ; /* skip LF part */
632+ } else {
633+ converted_message [j ++ ] = message [i ];
634+ }
635+ }
636+
637+ converted_message [j ] = '\0' ;
638+ fprintf (sendmail , "%s" , converted_message );
639+ efree (converted_message );
640+ }
641+ } else {
642+ fprintf (sendmail , "%s" , message );
643+ }
644+
645+ fprintf (sendmail , "%s" , line_sep );
590646#ifdef PHP_WIN32
591647 ret = pclose (sendmail );
592648
0 commit comments