Commit 0039af028cb for php.net
commit 0039af028cb32b53239225cba3459995d3bd7e5d
Author: Ilija Tovilo <ilija.tovilo@me.com>
Date: Tue Mar 3 13:37:04 2026 +0100
Propagate bind error for stream_socket_server()
When stream_socket_server() fails during bind(), we're currently only showing
"Unknown error" in the error message. Properly propagate this error for better
diagnostics.
Closes GH-21328
diff --git a/NEWS b/NEWS
index 4dcac8bb21e..ca6b431d70c 100644
--- a/NEWS
+++ b/NEWS
@@ -145,6 +145,7 @@ PHP NEWS
. Allowed filtered streams to be casted as fd for select. (Jakub Zelenka)
. Fixed bug GH-21221 (Prevent closing of innerstream of php://temp stream).
(ilutov)
+ . Improved stream_socket_server() bind failure error reporting. (ilutov)
- Zip:
. Fixed ZipArchive callback being called after executor has shut down.
diff --git a/ext/standard/tests/network/stream_socket_server_bind_error.phpt b/ext/standard/tests/network/stream_socket_server_bind_error.phpt
new file mode 100644
index 00000000000..2f5becb66a9
--- /dev/null
+++ b/ext/standard/tests/network/stream_socket_server_bind_error.phpt
@@ -0,0 +1,19 @@
+--TEST--
+stream_socket_server() bind error
+--SKIPIF--
+<?php
+if (substr(PHP_OS, 0, 3) == 'WIN' ) {
+ die('skip not for Windows');
+}
+?>
+--FILE--
+<?php
+
+$server1 = stream_socket_server("tcp://0.0.0.0:0");
+$name = stream_socket_get_name($server1, false);
+$server2 = stream_socket_server("tcp://$name");
+fclose($server1);
+
+?>
+--EXPECTF--
+Warning: stream_socket_server(): Unable to connect to tcp://0.0.0.0:%d (Address %r(already )?%rin use) in %s on line %d
diff --git a/main/streams/xp_socket.c b/main/streams/xp_socket.c
index 9eae9e460e4..f21944313d3 100644
--- a/main/streams/xp_socket.c
+++ b/main/streams/xp_socket.c
@@ -699,8 +699,13 @@ static inline int php_tcp_sockop_bind(php_stream *stream, php_netstream_data_t *
parse_unix_address(xparam, &unix_addr);
- return bind(sock->socket, (const struct sockaddr *)&unix_addr,
+ int result = bind(sock->socket, (const struct sockaddr *)&unix_addr,
(socklen_t) XtOffsetOf(struct sockaddr_un, sun_path) + xparam->inputs.namelen);
+ if (result == -1 && xparam->want_errortext) {
+ char errstr[256];
+ xparam->outputs.error_text = strpprintf(0, "%s", php_socket_strerror_s(errno, errstr, sizeof(errstr)));
+ }
+ return result;
}
#endif