From 0039af028cb32b53239225cba3459995d3bd7e5d Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Tue, 3 Mar 2026 13:37:04 +0100 Subject: [PATCH] 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 --- NEWS | 1 + .../stream_socket_server_bind_error.phpt | 19 +++++++++++++++++++ main/streams/xp_socket.c | 7 ++++++- 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 ext/standard/tests/network/stream_socket_server_bind_error.phpt 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-- + +--FILE-- + +--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