summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-04-08 13:00:05 +0200
committerNikita Popov <nikita.ppv@gmail.com>2019-04-08 13:00:05 +0200
commita90ac8b5b2266b5de25bf3d06147e7d791c87fad (patch)
tree1703699997e45c02280fb158a6db2857611caa82
parent08a306281622e7795de820ca38ec42274c6e0b44 (diff)
parentbdac9ef10d90997f9576564dde693cbef6594142 (diff)
downloadphp-git-a90ac8b5b2266b5de25bf3d06147e7d791c87fad.tar.gz
Merge branch 'PHP-7.2' into PHP-7.3
-rw-r--r--ext/standard/streamsfuncs.c12
-rw-r--r--ext/standard/tests/streams/stream_select_preserve_keys.phpt35
2 files changed, 43 insertions, 4 deletions
diff --git a/ext/standard/streamsfuncs.c b/ext/standard/streamsfuncs.c
index 9b7bcdbd60..8f0bd8bc8e 100644
--- a/ext/standard/streamsfuncs.c
+++ b/ext/standard/streamsfuncs.c
@@ -707,13 +707,15 @@ static int stream_array_emulate_read_fd_set(zval *stream_array)
HashTable *ht;
php_stream *stream;
int ret = 0;
+ zend_ulong num_ind;
+ zend_string *key;
if (Z_TYPE_P(stream_array) != IS_ARRAY) {
return 0;
}
ht = zend_new_array(zend_hash_num_elements(Z_ARRVAL_P(stream_array)));
- ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(stream_array), elem) {
+ ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(stream_array), num_ind, key, elem) {
ZVAL_DEREF(elem);
php_stream_from_zval_no_verify(stream, elem);
if (stream == NULL) {
@@ -726,10 +728,12 @@ static int stream_array_emulate_read_fd_set(zval *stream_array)
* This branch of code also allows blocking streams with buffered data to
* operate correctly in stream_select.
* */
- dest_elem = zend_hash_next_index_insert(ht, elem);
- if (dest_elem) {
- zval_add_ref(dest_elem);
+ if (!key) {
+ dest_elem = zend_hash_index_update(ht, num_ind, elem);
+ } else {
+ dest_elem = zend_hash_update(ht, key, elem);
}
+ zval_add_ref(dest_elem);
ret++;
continue;
}
diff --git a/ext/standard/tests/streams/stream_select_preserve_keys.phpt b/ext/standard/tests/streams/stream_select_preserve_keys.phpt
new file mode 100644
index 0000000000..390709faf4
--- /dev/null
+++ b/ext/standard/tests/streams/stream_select_preserve_keys.phpt
@@ -0,0 +1,35 @@
+--TEST--
+Bug #53427 + emulate_read (stream_select does not preserve keys)
+--FILE--
+<?php
+$read[1] = fopen(__FILE__, 'r');
+$read['myindex'] = reset($read);
+$write = NULL;
+$except = NULL;
+
+var_dump($read);
+stream_select($read, $write, $except, 0);
+var_dump($read);
+fread(reset($read), 1);
+stream_select($read, $write, $except, 0); // // emulate_read
+var_dump($read);
+?>
+--EXPECTF--
+array(2) {
+ [1]=>
+ resource(%d) of type (stream)
+ ["myindex"]=>
+ resource(%d) of type (stream)
+}
+array(2) {
+ [1]=>
+ resource(%d) of type (stream)
+ ["myindex"]=>
+ resource(%d) of type (stream)
+}
+array(2) {
+ [1]=>
+ resource(%d) of type (stream)
+ ["myindex"]=>
+ resource(%d) of type (stream)
+}