summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/standard/streamsfuncs.c3
-rw-r--r--ext/standard/tests/streams/bug72075.phpt15
2 files changed, 18 insertions, 0 deletions
diff --git a/ext/standard/streamsfuncs.c b/ext/standard/streamsfuncs.c
index def1fb88d7..0e5d0ce79e 100644
--- a/ext/standard/streamsfuncs.c
+++ b/ext/standard/streamsfuncs.c
@@ -613,6 +613,7 @@ static int stream_array_to_fd_set(zval *stream_array, fd_set *fds, php_socket_t
the higher bits of a SOCKET variable uninitialized on systems with little endian. */
php_socket_t this_fd;
+ ZVAL_DEREF(elem);
php_stream_from_zval_no_verify(stream, elem);
if (stream == NULL) {
continue;
@@ -652,6 +653,7 @@ static int stream_array_from_fd_set(zval *stream_array, fd_set *fds)
ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(stream_array), num_ind, key, elem) {
php_socket_t this_fd;
+ ZVAL_DEREF(elem);
php_stream_from_zval_no_verify(stream, elem);
if (stream == NULL) {
continue;
@@ -698,6 +700,7 @@ static int stream_array_emulate_read_fd_set(zval *stream_array)
zend_hash_init(Z_ARRVAL(new_array), zend_hash_num_elements(Z_ARRVAL_P(stream_array)), NULL, ZVAL_PTR_DTOR, 0);
ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(stream_array), elem) {
+ ZVAL_DEREF(elem);
php_stream_from_zval_no_verify(stream, elem);
if (stream == NULL) {
continue;
diff --git a/ext/standard/tests/streams/bug72075.phpt b/ext/standard/tests/streams/bug72075.phpt
new file mode 100644
index 0000000000..93dce60350
--- /dev/null
+++ b/ext/standard/tests/streams/bug72075.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Bug #72075 (Referencing socket resources breaks stream_select)
+--FILE--
+<?php
+$r = [stream_socket_server("tcp://127.0.0.1:0", $errno, $errStr)];
+$w = NULL;
+$e = NULL;
+
+// Without this line, all is well:
+$dummy =& $r[0];
+
+print stream_select($r, $w, $e, 0.5);
+
+--EXPECT--
+0