diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2019-04-08 13:00:05 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2019-04-08 13:00:05 +0200 |
commit | a90ac8b5b2266b5de25bf3d06147e7d791c87fad (patch) | |
tree | 1703699997e45c02280fb158a6db2857611caa82 | |
parent | 08a306281622e7795de820ca38ec42274c6e0b44 (diff) | |
parent | bdac9ef10d90997f9576564dde693cbef6594142 (diff) | |
download | php-git-a90ac8b5b2266b5de25bf3d06147e7d791c87fad.tar.gz |
Merge branch 'PHP-7.2' into PHP-7.3
-rw-r--r-- | ext/standard/streamsfuncs.c | 12 | ||||
-rw-r--r-- | ext/standard/tests/streams/stream_select_preserve_keys.phpt | 35 |
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) +} |