From d9ff5e079f73464374eb9b7ab0b8d5ae281fa8fe Mon Sep 17 00:00:00 2001 From: Jakub Zelenka Date: Thu, 4 Aug 2022 20:52:44 +0100 Subject: [PATCH] Fix GH-8472: stream_socket_accept result may have incorrect metadata --- NEWS | 4 +++ ext/openssl/xp_ssl.c | 4 +++ ext/standard/tests/streams/gh8472.phpt | 35 ++++++++++++++++++++++++++ main/streams/xp_socket.c | 4 +++ 4 files changed, 47 insertions(+) create mode 100644 ext/standard/tests/streams/gh8472.phpt diff --git a/NEWS b/NEWS index 1c9cf761660..d71a5c718c3 100644 --- a/NEWS +++ b/NEWS @@ -24,6 +24,10 @@ PHP NEWS . Fixed bug GH-9017 (php_stream_sock_open_from_socket could return NULL). (Heiko Weber) +- Streams: + . Fixed bug GH-8472 (The resource returned by stream_socket_accept may have + incorrect metadata). (Jakub Zelenka) + 04 Aug 2022, PHP 8.0.22 - CLI: diff --git a/ext/openssl/xp_ssl.c b/ext/openssl/xp_ssl.c index 206543ca822..8299455a2e8 100644 --- a/ext/openssl/xp_ssl.c +++ b/ext/openssl/xp_ssl.c @@ -2287,6 +2287,10 @@ static inline int php_openssl_tcp_sockop_accept(php_stream *stream, php_openssl_ memcpy(clisockdata, sock, sizeof(clisockdata->s)); clisockdata->s.socket = clisock; +#ifdef __linux__ + /* O_NONBLOCK is not inherited on Linux */ + clisockdata->s.is_blocked = 1; +#endif xparam->outputs.client = php_stream_alloc_rel(stream->ops, clisockdata, NULL, "r+"); if (xparam->outputs.client) { diff --git a/ext/standard/tests/streams/gh8472.phpt b/ext/standard/tests/streams/gh8472.phpt new file mode 100644 index 00000000000..b03c0ceb5e1 --- /dev/null +++ b/ext/standard/tests/streams/gh8472.phpt @@ -0,0 +1,35 @@ +--TEST-- +GH-8472: The resource returned by stream_socket_accept may have incorrect metadata +--FILE-- + +--EXPECT-- +string(4) "0000" +string(1) "0" diff --git a/main/streams/xp_socket.c b/main/streams/xp_socket.c index a369bf5ff2d..68df3366340 100644 --- a/main/streams/xp_socket.c +++ b/main/streams/xp_socket.c @@ -840,6 +840,10 @@ static inline int php_tcp_sockop_accept(php_stream *stream, php_netstream_data_t memcpy(clisockdata, sock, sizeof(*clisockdata)); clisockdata->socket = clisock; +#ifdef __linux__ + /* O_NONBLOCK is not inherited on Linux */ + clisockdata->is_blocked = 1; +#endif xparam->outputs.client = php_stream_alloc_rel(stream->ops, clisockdata, NULL, "r+"); if (xparam->outputs.client) {