diff options
-rw-r--r-- | ext/standard/streamsfuncs.c | 3 | ||||
-rw-r--r-- | ext/standard/tests/streams/bug72075.phpt | 15 |
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 |