Commit 3882f55a61f for php.net

commit 3882f55a61f831b4e222487bc1c50cc21b6803df
Author: Weilin Du <weilindu@php.net>
Date:   Fri Jul 17 04:09:02 2026 +0800

    ext/sockets: Fix socket_set_option() validation error messages (#22772)

    Fix a few incorrect socket_set_option() validation error messages.

diff --git a/NEWS b/NEWS
index c35b46d24c0..d989b44146d 100644
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,10 @@ PHP                                                                        NEWS
 - Date:
   . Fixed leak on double DatePeriod::__construct() call. (ilutov)

+- Sockets:
+  . Fixed socket_set_option() validation error messages for UDP_SEGMENT and
+    SO_LINGER options. (Weilin Du)
+
 30 Jul 2026, PHP 8.5.9

 - Core:
diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c
index 0e11280c914..5c8ad859851 100644
--- a/ext/sockets/sockets.c
+++ b/ext/sockets/sockets.c
@@ -2168,7 +2168,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();
 			}

@@ -2332,8 +2332,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 679b246ea9d..38a91406651 100644
--- a/ext/sockets/tests/socket_cmsg_udp_segment.phpt
+++ b/ext/sockets/tests/socket_cmsg_udp_segment.phpt
@@ -22,5 +22,5 @@
 }
 ?>
 --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_set_option_timeo_error.phpt b/ext/sockets/tests/socket_set_option_timeo_error.phpt
index 1db5e01c362..befdfb09585 100644
--- a/ext/sockets/tests/socket_set_option_timeo_error.phpt
+++ b/ext/sockets/tests/socket_set_option_timeo_error.phpt
@@ -13,6 +13,7 @@
 $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 @@
 } 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 @@
 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