Commit 77d306ef385 for php.net

commit 77d306ef385e4f1108efab6f3f7a4ee28386d950
Author: Gina Peter Banyard <girgias@php.net>
Date:   Fri Dec 26 01:45:47 2025 +0100

    win32/sendmail.c/PostHeader(): refactor function

    Input as zend_string
    Use smart_str to concatenate strings
    Change return type to bool

diff --git a/win32/sendmail.c b/win32/sendmail.c
index 5f79f1ada79..394676f3031 100644
--- a/win32/sendmail.c
+++ b/win32/sendmail.c
@@ -32,6 +32,7 @@

 #include "php_win32_globals.h"

+#include "Zend/zend_smart_str.h"
 #include "ext/pcre/php_pcre.h"
 #include "ext/standard/php_string.h"
 #include "ext/date/php_date.h"
@@ -114,7 +115,7 @@ static const char *ErrorMessages[] =
 static int SendText(char *RPath, const char *Subject, const char *mailTo, const char *data,
                     zend_string *headers, zend_string *headers_lc, char **error_message);
 static int MailConnect();
-static int PostHeader(char *RPath, const char *Subject, const char *mailTo, char *xheaders);
+static bool PostHeader(char *RPath, const char *Subject, const char *mailTo, zend_string *xheaders);
 static bool Post(LPCSTR msg);
 static int Ack(char **server_response);
 static unsigned long GetAddr(LPSTR szHost);
@@ -589,16 +590,17 @@ static int SendText(char *RPath, const char *Subject, const char *mailTo, const
 	}

 	/* send message header */
+	bool PostHeaderIsSuccessful = false;
 	if (Subject == NULL) {
-		res = PostHeader(RPath, "No Subject", mailTo, stripped_header ? ZSTR_VAL(stripped_header) : NULL);
+		PostHeaderIsSuccessful = PostHeader(RPath, "No Subject", mailTo, stripped_header);
 	} else {
-		res = PostHeader(RPath, Subject, mailTo, stripped_header ? ZSTR_VAL(stripped_header) : NULL);
+		PostHeaderIsSuccessful = PostHeader(RPath, Subject, mailTo, stripped_header);
 	}
 	if (stripped_header) {
 		zend_string_release_ex(stripped_header, false);
 	}
-	if (res != SUCCESS) {
-		return (res);
+	if (!PostHeaderIsSuccessful) {
+		return FAILED_TO_SEND;
 	}

 	/* Escape \n. sequences
@@ -645,14 +647,6 @@ static int SendText(char *RPath, const char *Subject, const char *mailTo, const
 	return (SUCCESS);
 }

-static void addToHeader(char **header_buffer, const char *specifier, const char *string)
-{
-	size_t header_buffer_size = strlen(*header_buffer);
-	size_t total_size = header_buffer_size + strlen(specifier) + strlen(string) + 1;
-	*header_buffer = erealloc(*header_buffer, total_size);
-	snprintf(*header_buffer + header_buffer_size, total_size - header_buffer_size, specifier, string);
-}
-
 //*********************************************************************
 // Name:  PostHeader
 // Input:       1) return path
@@ -664,64 +658,58 @@ static void addToHeader(char **header_buffer, const char *specifier, const char
 // Author/Date:  jcar 20/9/96
 // History:
 //*********************************************************************
-static int PostHeader(char *RPath, const char *Subject, const char *mailTo, char *xheaders)
+static bool PostHeader(char *RPath, const char *Subject, const char *mailTo, zend_string *xheaders)
 {
 	/* Print message header according to RFC 822 */
 	/* Return-path, Received, Date, From, Subject, Sender, To, cc */

-	int res;
-	char *header_buffer;
-	char *headers_lc = NULL;
-	size_t i;
+	zend_string *headers_lc = NULL;
+	smart_str combined_headers = {0};

 	if (xheaders) {
-		size_t headers_lc_len;
-
-		headers_lc = estrdup(xheaders);
-		headers_lc_len = strlen(headers_lc);
-
-		for (i = 0; i < headers_lc_len; i++) {
-			headers_lc[i] = tolower(headers_lc[i]);
-		}
+		headers_lc = zend_string_tolower(xheaders);
 	}

-	header_buffer = ecalloc(1, MAIL_BUFFER_SIZE);
-
-	if (!xheaders || !strstr(headers_lc, "date:")) {
+	if (!xheaders || !strstr(ZSTR_VAL(headers_lc), "date:")) {
 		time_t tNow = time(NULL);
 		zend_string *dt = php_format_date("r", 1, tNow, 1);

-		snprintf(header_buffer, MAIL_BUFFER_SIZE, "Date: %s\r\n", ZSTR_VAL(dt));
+		smart_str_appends(&combined_headers, "Date: ");
+		smart_str_append(&combined_headers, dt);
+		smart_str_appends(&combined_headers, "\r\n");
 		zend_string_free(dt);
 	}

-	if (!headers_lc || !strstr(headers_lc, "from:")) {
-		addToHeader(&header_buffer, "From: %s\r\n", RPath);
+	if (!headers_lc || !strstr(ZSTR_VAL(headers_lc), "from:")) {
+		smart_str_appends(&combined_headers, "From: ");
+		smart_str_appends(&combined_headers, RPath);
+		smart_str_appends(&combined_headers, "\r\n");
 	}
-	addToHeader(&header_buffer, "Subject: %s\r\n", Subject);
+	smart_str_appends(&combined_headers, "Subject: ");
+	smart_str_appends(&combined_headers, Subject);
+	smart_str_appends(&combined_headers, "\r\n");

 	/* Only add the To: field from the $to parameter if isn't in the custom headers */
-	if ((headers_lc && (!strstr(headers_lc, "\r\nto:") && (strncmp(headers_lc, "to:", 3) != 0))) || !headers_lc) {
-		addToHeader(&header_buffer, "To: %s\r\n", mailTo);
+	if (!headers_lc || (!strstr(ZSTR_VAL(headers_lc), "\r\nto:") && (strncmp(ZSTR_VAL(headers_lc), "to:", 3) != 0))) {
+		smart_str_appends(&combined_headers, "To: ");
+		smart_str_appends(&combined_headers, mailTo);
+		smart_str_appends(&combined_headers, "\r\n");
 	}
 	if (xheaders) {
-		addToHeader(&header_buffer, "%s\r\n", xheaders);
+		smart_str_append(&combined_headers, xheaders);
+		smart_str_appends(&combined_headers, "\r\n");
 	}
+	/* End of headers */
+	smart_str_appends(&combined_headers, "\r\n");
+	zend_string *combined_headers_str = smart_str_extract(&combined_headers);

 	if (headers_lc) {
-		efree(headers_lc);
-	}
-	if (!Post(header_buffer)) {
-		efree(header_buffer);
-		return (FAILED_TO_SEND);
+		zend_string_release_ex(headers_lc, false);
 	}
-	efree(header_buffer);

-	if (!Post("\r\n")) {
-		return (FAILED_TO_SEND);
-	}
-
-	return (SUCCESS);
+	bool header_post_status = Post(ZSTR_VAL(combined_headers_str));
+	zend_string_efree(combined_headers_str);
+	return header_post_status;
 }