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