@@ -115,7 +115,7 @@ static const char *ErrorMessages[] =
115115static int SendText (char * RPath , const char * Subject , const char * mailTo , const char * data ,
116116 zend_string * headers , zend_string * headers_lc , char * * error_message );
117117static int MailConnect ();
118- static int PostHeader (char * RPath , const char * Subject , const char * mailTo , char * xheaders );
118+ static bool PostHeader (char * RPath , const char * Subject , const char * mailTo , zend_string * xheaders );
119119static bool Post (LPCSTR msg );
120120static int Ack (char * * server_response );
121121static unsigned long GetAddr (LPSTR szHost );
@@ -589,16 +589,17 @@ static int SendText(char *RPath, const char *Subject, const char *mailTo, const
589589 }
590590
591591 /* send message header */
592+ bool PostHeaderIsSuccessful = false;
592593 if (Subject == NULL ) {
593- res = PostHeader (RPath , "No Subject" , mailTo , stripped_header ? ZSTR_VAL ( stripped_header ) : NULL );
594+ PostHeaderIsSuccessful = PostHeader (RPath , "No Subject" , mailTo , stripped_header );
594595 } else {
595- res = PostHeader (RPath , Subject , mailTo , stripped_header ? ZSTR_VAL ( stripped_header ) : NULL );
596+ PostHeaderIsSuccessful = PostHeader (RPath , Subject , mailTo , stripped_header );
596597 }
597598 if (stripped_header ) {
598599 zend_string_release_ex (stripped_header , false);
599600 }
600- if (res != SUCCESS ) {
601- return ( res ) ;
601+ if (! PostHeaderIsSuccessful ) {
602+ return FAILED_TO_SEND ;
602603 }
603604
604605 /* Escape \n. sequences
@@ -645,14 +646,6 @@ static int SendText(char *RPath, const char *Subject, const char *mailTo, const
645646 return (SUCCESS );
646647}
647648
648- static void addToHeader (char * * header_buffer , const char * specifier , const char * string )
649- {
650- size_t header_buffer_size = strlen (* header_buffer );
651- size_t total_size = header_buffer_size + strlen (specifier ) + strlen (string ) + 1 ;
652- * header_buffer = erealloc (* header_buffer , total_size );
653- snprintf (* header_buffer + header_buffer_size , total_size - header_buffer_size , specifier , string );
654- }
655-
656649//*********************************************************************
657650// Name: PostHeader
658651// Input: 1) return path
@@ -664,64 +657,58 @@ static void addToHeader(char **header_buffer, const char *specifier, const char
664657// Author/Date: jcar 20/9/96
665658// History:
666659//*********************************************************************
667- static int PostHeader (char * RPath , const char * Subject , const char * mailTo , char * xheaders )
660+ static bool PostHeader (char * RPath , const char * Subject , const char * mailTo , zend_string * xheaders )
668661{
669662 /* Print message header according to RFC 822 */
670663 /* Return-path, Received, Date, From, Subject, Sender, To, cc */
671664
672- int res ;
673- char * header_buffer ;
674- char * headers_lc = NULL ;
675- size_t i ;
665+ zend_string * headers_lc = NULL ;
666+ smart_str combined_headers = {0 };
676667
677668 if (xheaders ) {
678- size_t headers_lc_len ;
679-
680- headers_lc = estrdup (xheaders );
681- headers_lc_len = strlen (headers_lc );
682-
683- for (i = 0 ; i < headers_lc_len ; i ++ ) {
684- headers_lc [i ] = tolower (headers_lc [i ]);
685- }
669+ headers_lc = zend_string_tolower (xheaders );
686670 }
687671
688- header_buffer = ecalloc (1 , MAIL_BUFFER_SIZE );
689-
690- if (!xheaders || !strstr (headers_lc , "date:" )) {
672+ if (!xheaders || !strstr (ZSTR_VAL (headers_lc ), "date:" )) {
691673 time_t tNow = time (NULL );
692674 zend_string * dt = php_format_date ("r" , 1 , tNow , 1 );
693675
694- snprintf (header_buffer , MAIL_BUFFER_SIZE , "Date: %s\r\n" , ZSTR_VAL (dt ));
676+ zend_string_appends (& combined_headers , "Date: " );
677+ zend_string_append (& combined_headers , dt );
678+ zend_string_appends (& combined_headers , "\r\n" );
695679 zend_string_free (dt );
696680 }
697681
698- if (!headers_lc || !strstr (headers_lc , "from:" )) {
699- addToHeader (& header_buffer , "From: %s\r\n" , RPath );
682+ if (!headers_lc || !strstr (ZSTR_VAL (headers_lc ), "from:" )) {
683+ zend_string_appends (& combined_headers , "From: " );
684+ zend_string_appends (& combined_headers , RPath );
685+ zend_string_appends (& combined_headers , "\r\n" );
700686 }
701- addToHeader (& header_buffer , "Subject: %s\r\n" , Subject );
687+ zend_string_appends (& combined_headers , "Subject: " );
688+ zend_string_appends (& combined_headers , Subject );
689+ zend_string_appends (& combined_headers , "\r\n" );
702690
703691 /* Only add the To: field from the $to parameter if isn't in the custom headers */
704- if ((headers_lc && (!strstr (headers_lc , "\r\nto:" ) && (strncmp (headers_lc , "to:" , 3 ) != 0 ))) || !headers_lc ) {
705- addToHeader (& header_buffer , "To: %s\r\n" , mailTo );
692+ if (!headers_lc || (!strstr (ZSTR_VAL (headers_lc ), "\r\nto:" ) && (strncmp (ZSTR_VAL (headers_lc ), "to:" , 3 ) != 0 ))) {
693+ zend_string_appends (& combined_headers , "To: " );
694+ zend_string_appends (& combined_headers , mailTo );
695+ zend_string_appends (& combined_headers , "\r\n" );
706696 }
707697 if (xheaders ) {
708- addToHeader (& header_buffer , "%s\r\n" , xheaders );
698+ zend_string_append (& combined_headers , xheaders );
699+ zend_string_appends (& combined_headers , "\r\n" );
709700 }
701+ /* End of headers */
702+ zend_string_appends (& combined_headers , "\r\n" );
703+ zend_string * combined_headers_str = smart_str_extract (combined_headers );
710704
711705 if (headers_lc ) {
712- efree (headers_lc );
713- }
714- if (!Post (header_buffer )) {
715- efree (header_buffer );
716- return (FAILED_TO_SEND );
706+ zend_string_release_ex (headers_lc , false);
717707 }
718- efree (header_buffer );
719708
720- if (!Post ("\r\n" )) {
721- return (FAILED_TO_SEND );
722- }
723-
724- return (SUCCESS );
709+ bool header_post_status = Post (ZSTR_VAL (combined_headers_str ));
710+ zend_string_release_ex (combined_headers_str , false);
711+ return header_post_status ;
725712}
726713
727714
0 commit comments