Commit aa12a652c33 for php.net

commit aa12a652c33755f2b932b34442f2109b376d5ea7
Author: Weilin Du <weilindu@php.net>
Date:   Sun Jul 5 12:28:12 2026 +0800

    ext/soap: Add `UNEXPECTED()` in obvious error path (#22596)

    This added `UNEXPECTED()` in several obvious error path for optimization
    in ext/soap.

diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c
index f02a1663802..e474798df6d 100644
--- a/ext/soap/php_encoding.c
+++ b/ext/soap/php_encoding.c
@@ -2052,7 +2052,7 @@ static int calc_dimension_12(const char* str)

 static void soap_array_position_add_digit(int *position, int digit)
 {
-	if (*position > (INT_MAX - digit) / 10) {
+	if (UNEXPECTED(*position > (INT_MAX - digit) / 10)) {
 		soap_error0(E_ERROR, "Encoding: array index out of range");
 	}

@@ -2697,7 +2697,7 @@ static zval *to_zval_array(zval *ret, encodeTypePtr type, xmlNodePtr data)
 			i = dimension;
 			while (i > 0) {
 				i--;
-				if (pos[i] == INT_MAX) {
+				if (UNEXPECTED(pos[i] == INT_MAX)) {
 					efree(dims);
 					efree(pos);
 					zval_ptr_dtor(ret);
diff --git a/ext/soap/php_http.c b/ext/soap/php_http.c
index 4fe272ea6f1..b02942f3dcc 100644
--- a/ext/soap/php_http.c
+++ b/ext/soap/php_http.c
@@ -1488,7 +1488,7 @@ static zend_string* get_http_body(php_stream *stream, bool close, zend_string *h
 				if (buf_size > 0) {
 					size_t len_size = 0;

-					if (http_buf_size + buf_size + 1 < 0) {
+					if (UNEXPECTED(http_buf_size + buf_size + 1 < 0)) {
 						if (http_buf) {
 							zend_string_release_ex(http_buf, 0);
 						}
@@ -1503,7 +1503,7 @@ static zend_string* get_http_body(php_stream *stream, bool close, zend_string *h

 					while (len_size < buf_size) {
 						ssize_t len_read = php_stream_read(stream, http_buf->val + http_buf_size, buf_size - len_size);
-						if (len_read <= 0) {
+						if (UNEXPECTED(len_read <= 0)) {
 							/* Error or EOF */
 							done = true;
 						  break;
@@ -1517,7 +1517,7 @@ static zend_string* get_http_body(php_stream *stream, bool close, zend_string *h
 					if (ch == '\r') {
 						ch = php_stream_getc(stream);
 					}
-					if (ch != '\n') {
+					if (UNEXPECTED(ch != '\n')) {
 						/* Something wrong in chunked encoding */
 						if (http_buf) {
 							zend_string_release_ex(http_buf, 0);
@@ -1555,13 +1555,13 @@ static zend_string* get_http_body(php_stream *stream, bool close, zend_string *h
 		}

 	} else if (header_length) {
-		if (header_length < 0 || header_length >= INT_MAX) {
+		if (UNEXPECTED(header_length < 0 || header_length >= INT_MAX)) {
 			return NULL;
 		}
 		http_buf = zend_string_alloc(header_length, 0);
 		while (http_buf_size < header_length) {
 			ssize_t len_read = php_stream_read(stream, http_buf->val + http_buf_size, header_length - http_buf_size);
-			if (len_read <= 0) {
+			if (UNEXPECTED(len_read <= 0)) {
 				break;
 			}
 			http_buf_size += len_read;
diff --git a/ext/soap/php_packet_soap.c b/ext/soap/php_packet_soap.c
index 68ed9a7a768..29ed1294f36 100644
--- a/ext/soap/php_packet_soap.c
+++ b/ext/soap/php_packet_soap.c
@@ -59,11 +59,11 @@ bool parse_packet_soap(zval *this_ptr, zend_string *buffer, sdlFunctionPtr fn, z
 	/* Parse XML packet */
 	response = soap_xmlParseMemory(ZSTR_VAL(buffer), ZSTR_LEN(buffer));

-	if (!response) {
+	if (UNEXPECTED(!response)) {
 		add_soap_fault(this_ptr, "Client", "looks like we got no XML document", NULL, NULL, soap_lang_en);
 		return false;
 	}
-	if (xmlGetIntSubset(response) != NULL) {
+	if (UNEXPECTED(xmlGetIntSubset(response) != NULL)) {
 		add_soap_fault(this_ptr, "Client", "DTD are not supported by SOAP", NULL, NULL, soap_lang_en);
 		xmlFreeDoc(response);
 		return false;
@@ -90,7 +90,7 @@ bool parse_packet_soap(zval *this_ptr, zend_string *buffer, sdlFunctionPtr fn, z
 		}
 		trav = trav->next;
 	}
-	if (env == NULL) {
+	if (UNEXPECTED(env == NULL)) {
 		add_soap_fault(this_ptr, "Client", "looks like we got XML without \"Envelope\" element", NULL, NULL, soap_lang_en);
 		xmlFreeDoc(response);
 		return false;
@@ -139,7 +139,7 @@ bool parse_packet_soap(zval *this_ptr, zend_string *buffer, sdlFunctionPtr fn, z
 	while (trav != NULL && trav->type != XML_ELEMENT_NODE) {
 		trav = trav->next;
 	}
-	if (body == NULL) {
+	if (UNEXPECTED(body == NULL)) {
 		add_soap_fault(this_ptr, "Client", "Body must be present in a SOAP envelope", NULL, NULL, soap_lang_en);
 		xmlFreeDoc(response);
 		return false;
@@ -165,7 +165,7 @@ bool parse_packet_soap(zval *this_ptr, zend_string *buffer, sdlFunctionPtr fn, z
 		}
 		attr = attr->next;
 	}
-	if (trav != NULL && soap_version == SOAP_1_2) {
+	if (UNEXPECTED(trav != NULL && soap_version == SOAP_1_2)) {
 		add_soap_fault(this_ptr, "Client", "A SOAP 1.2 envelope can contain only Header and Body", NULL, NULL, soap_lang_en);
 		xmlFreeDoc(response);
 		return false;
diff --git a/ext/soap/php_schema.c b/ext/soap/php_schema.c
index d97a0eac05b..b675b97b469 100644
--- a/ext/soap/php_schema.c
+++ b/ext/soap/php_schema.c
@@ -63,12 +63,12 @@ static int schema_parse_int(const xmlChar *value, const char *name, bool allow_n
 	if (type != IS_LONG) {
 		errno = 0;
 		lval = ZEND_STRTOL(str, NULL, 10);
-		if (oflow_info || (errno == ERANGE && lval != 0)) {
+		if (UNEXPECTED(oflow_info || (errno == ERANGE && lval != 0))) {
 			soap_error1(E_ERROR, "Parsing Schema: %s value is out of range", name);
 		}
 	}

-	if (ZEND_LONG_EXCEEDS_INT(lval) || (!allow_negative && lval < 0)) {
+	if (UNEXPECTED(ZEND_LONG_EXCEEDS_INT(lval) || (!allow_negative && lval < 0))) {
 		soap_error1(E_ERROR, "Parsing Schema: %s value is out of range", name);
 	}

diff --git a/ext/soap/php_sdl.c b/ext/soap/php_sdl.c
index 07c5dbf4f12..73886af5a56 100644
--- a/ext/soap/php_sdl.c
+++ b/ext/soap/php_sdl.c
@@ -1524,22 +1524,22 @@ static sdlPtr get_sdl_from_cache(const char *fn, const char *uri, size_t uri_len
 	char *in, *buf;

 	f = open(fn, O_RDONLY|O_BINARY);
-	if (f < 0) {
+	if (UNEXPECTED(f < 0)) {
 		return NULL;
 	}
-	if (fstat(f, &st) != 0) {
+	if (UNEXPECTED(fstat(f, &st) != 0)) {
 		close(f);
 		return NULL;
 	}
 	buf = in = emalloc(st.st_size);
-	if (read(f, in, st.st_size) != st.st_size) {
+	if (UNEXPECTED(read(f, in, st.st_size) != st.st_size)) {
 		close(f);
 		efree(in);
 		return NULL;
 	}
 	close(f);

-	if (strncmp(in,"wsdl",4) != 0 || in[4] != WSDL_CACHE_VERSION || in[5] != '\0') {
+	if (UNEXPECTED(strncmp(in,"wsdl",4) != 0 || in[4] != WSDL_CACHE_VERSION || in[5] != '\0')) {
 		unlink(fn);
 		efree(buf);
 		return NULL;
@@ -2096,7 +2096,7 @@ static void add_sdl_to_cache(const char *fn, const char *uri, time_t t, sdlPtr s
 	zend_string *temp_file_path;
 	f = php_open_temporary_fd_ex(SOAP_GLOBAL(cache_dir), "tmp.wsdl.", &temp_file_path, PHP_TMP_FILE_SILENT);

-	if (f < 0) {return;}
+	if (UNEXPECTED(f < 0)) {return;}

 	zend_hash_init(&tmp_types, 0, NULL, NULL, 0);
 	zend_hash_init(&tmp_encoders, 0, NULL, NULL, 0);
diff --git a/ext/soap/soap.c b/ext/soap/soap.c
index a3e03e0fb58..171b529b335 100644
--- a/ext/soap/soap.c
+++ b/ext/soap/soap.c
@@ -1008,7 +1008,7 @@ PHP_METHOD(SoapServer, __construct)
 				goto cleanup;
 			}
 			// TODO: this still accepts mixed keys arrays and not all numerically indexed arrays are packed
-			if (HT_IS_PACKED(Z_ARRVAL_P(class_map_zv))) {
+			if (UNEXPECTED(HT_IS_PACKED(Z_ARRVAL_P(class_map_zv)))) {
 				zend_argument_value_error(2, "\"classmap\" option must be an associative array");
 				goto cleanup;
 			}
@@ -2224,7 +2224,7 @@ PHP_METHOD(SoapClient, __construct)
 			xmlCharEncodingHandlerPtr encoding;

 			encoding = xmlFindCharEncodingHandler(Z_STRVAL_P(tmp));
-			if (encoding == NULL) {
+			if (UNEXPECTED(encoding == NULL)) {
 				php_error_docref(NULL, E_ERROR, "Invalid 'encoding' option - '%s'", Z_STRVAL_P(tmp));
 			} else {
 				xmlCharEncCloseFunc(encoding);
@@ -2233,7 +2233,7 @@ PHP_METHOD(SoapClient, __construct)
 		}
 		if ((tmp = zend_hash_str_find(ht, "classmap", sizeof("classmap")-1)) != NULL &&
 			Z_TYPE_P(tmp) == IS_ARRAY) {
-			if (HT_IS_PACKED(Z_ARRVAL_P(tmp))) {
+			if (UNEXPECTED(HT_IS_PACKED(Z_ARRVAL_P(tmp)))) {
 				php_error_docref(NULL, E_ERROR, "'classmap' option must be an associative array");
 			}
 			ZVAL_COPY(Z_CLIENT_CLASSMAP_P(this_ptr), tmp);