diff --git a/NEWS b/NEWS index cb10b3be0b6d..e1a8e55de7bc 100644 --- a/NEWS +++ b/NEWS @@ -25,6 +25,10 @@ PHP NEWS . Fixed bug GH-22681 (Reflection*::__toString() truncates on null bytes). (DanielEScherzer) +- Sockets: + . Fixed socket_set_option() validation error messages for UDP_SEGMENT and + SO_LINGER options. (Weilin Du) + 16 Jul 2026, PHP 8.6.0alpha2 - Core: diff --git a/ext/soap/php_http.c b/ext/soap/php_http.c index fe808404b526..43c2182ae47a 100644 --- a/ext/soap/php_http.c +++ b/ext/soap/php_http.c @@ -957,14 +957,14 @@ bool make_http_soap_request( if (tmp != NULL) { tmp++; http_status = atoi(tmp); - } - tmp = strstr(tmp," "); - if (tmp != NULL) { - tmp++; - if (http_msg) { - efree(http_msg); + tmp = strstr(tmp," "); + if (tmp != NULL) { + tmp++; + if (http_msg) { + efree(http_msg); + } + http_msg = estrdup(tmp); } - http_msg = estrdup(tmp); } efree(http_version); diff --git a/ext/soap/tests/http_status_line_no_code.phpt b/ext/soap/tests/http_status_line_no_code.phpt new file mode 100644 index 000000000000..de943571a492 --- /dev/null +++ b/ext/soap/tests/http_status_line_no_code.phpt @@ -0,0 +1,33 @@ +--TEST-- +SoapClient: malformed HTTP status line without status code must not crash +--EXTENSIONS-- +soap +--FILE-- + 'http://{{ ADDR }}', + 'uri' => 'http://testuri.org', + 'connection_timeout' => 3, +]); +var_dump($client->__doRequest('', 'http://{{ ADDR }}', 'T', 1)); +CODE; + +include sprintf('%s/../../openssl/tests/ServerClientTestCase.inc', __DIR__); +ServerClientTestCase::getInstance()->run($clientCode, $serverCode); +?> +--EXPECT-- +string(0) "" diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c index dbf7f4e6ad4b..ea90c2ae6425 100644 --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@ -2211,7 +2211,7 @@ PHP_FUNCTION(socket_set_option) } if (val_linger < 0 || val_linger > USHRT_MAX) { - zend_argument_value_error(4, "\"%s\" must be between 0 and %d", l_linger, USHRT_MAX); + zend_argument_value_error(4, "\"%s\" must be between 0 and %u", l_linger_key, USHRT_MAX); RETURN_THROWS(); } @@ -2375,8 +2375,8 @@ PHP_FUNCTION(socket_set_option) // UDP segmentation offload maximum size or 0 to disable it if (ov < 0 || ov > USHRT_MAX) { - zend_argument_value_error(4, "must be of between 0 and %u", USHRT_MAX); - RETURN_FALSE; + zend_argument_value_error(4, "must be between 0 and %u", USHRT_MAX); + RETURN_THROWS(); } optlen = sizeof(ov); diff --git a/ext/sockets/tests/socket_cmsg_udp_segment.phpt b/ext/sockets/tests/socket_cmsg_udp_segment.phpt index 679b246ea9d4..38a914066510 100644 --- a/ext/sockets/tests/socket_cmsg_udp_segment.phpt +++ b/ext/sockets/tests/socket_cmsg_udp_segment.phpt @@ -22,5 +22,5 @@ try { } ?> --EXPECT-- -socket_setopt(): Argument #4 ($value) must be of between 0 and 65535 -socket_setopt(): Argument #4 ($value) must be of between 0 and 65535 +socket_setopt(): Argument #4 ($value) must be between 0 and 65535 +socket_setopt(): Argument #4 ($value) must be between 0 and 65535 diff --git a/ext/sockets/tests/socket_sendto_recvfrom_afpacket_errors.phpt b/ext/sockets/tests/socket_sendto_recvfrom_afpacket_errors.phpt index 775a1381506c..a63c36c4f6b0 100644 --- a/ext/sockets/tests/socket_sendto_recvfrom_afpacket_errors.phpt +++ b/ext/sockets/tests/socket_sendto_recvfrom_afpacket_errors.phpt @@ -15,6 +15,8 @@ if (!function_exists("posix_getuid") || posix_getuid() != 0) { die('SKIP AF_PACKET requires root permissions.'); } ?> +--CONFLICTS-- +all --FILE-- new stdClass(), "usec" => "1"); $options_3 = array("l_onoff" => "aaaa", "l_linger" => "1"); $options_4 = array("l_onoff" => "1", "l_linger" => []); $options_5 = array("l_onoff" => PHP_INT_MAX, "l_linger" => "1"); +$options_6 = array("l_onoff" => "1", "l_linger" => PHP_INT_MAX); try { socket_set_option( $socket, SOL_SOCKET, SO_RCVTIMEO, new stdClass); @@ -56,6 +57,11 @@ try { } catch (\ValueError $e) { echo $e->getMessage() . PHP_EOL; } +try { + socket_set_option( $socket, SOL_SOCKET, SO_LINGER, $options_6); +} catch (\ValueError $e) { + echo $e->getMessage() . PHP_EOL; +} ?> --EXPECTF-- socket_set_option(): Argument #4 ($value) must have key "sec" @@ -64,3 +70,4 @@ Warning: Object of class stdClass could not be converted to int in %s on line %d socket_set_option(): Argument #4 ($value) must be of type array when argument #3 ($option) is SO_RCVTIMEO, string given socket_set_option(): Argument #4 ($value) must be of type array when argument #3 ($option) is SO_LINGER, string given socket_set_option(): Argument #4 ($value) "l_onoff" must be between 0 and %d +socket_set_option(): Argument #4 ($value) "l_linger" must be between 0 and %d