Skip to content

Commit 897cb8b

Browse files
committed
Merge branch 'PHP-7.3' into PHP-7.4
2 parents c3ca4dd + a90ac8b commit 897cb8b

File tree

2 files changed

+43
-4
lines changed

2 files changed

+43
-4
lines changed

ext/standard/streamsfuncs.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -694,13 +694,15 @@ static int stream_array_emulate_read_fd_set(zval *stream_array)
694694
HashTable *ht;
695695
php_stream *stream;
696696
int ret = 0;
697+
zend_ulong num_ind;
698+
zend_string *key;
697699

698700
if (Z_TYPE_P(stream_array) != IS_ARRAY) {
699701
return 0;
700702
}
701703
ht = zend_new_array(zend_hash_num_elements(Z_ARRVAL_P(stream_array)));
702704

703-
ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(stream_array), elem) {
705+
ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(stream_array), num_ind, key, elem) {
704706
ZVAL_DEREF(elem);
705707
php_stream_from_zval_no_verify(stream, elem);
706708
if (stream == NULL) {
@@ -713,10 +715,12 @@ static int stream_array_emulate_read_fd_set(zval *stream_array)
713715
* This branch of code also allows blocking streams with buffered data to
714716
* operate correctly in stream_select.
715717
* */
716-
dest_elem = zend_hash_next_index_insert(ht, elem);
717-
if (dest_elem) {
718-
zval_add_ref(dest_elem);
718+
if (!key) {
719+
dest_elem = zend_hash_index_update(ht, num_ind, elem);
720+
} else {
721+
dest_elem = zend_hash_update(ht, key, elem);
719722
}
723+
zval_add_ref(dest_elem);
720724
ret++;
721725
continue;
722726
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
--TEST--
2+
Bug #53427 + emulate_read (stream_select does not preserve keys)
3+
--FILE--
4+
<?php
5+
$read[1] = fopen(__FILE__, 'r');
6+
$read['myindex'] = reset($read);
7+
$write = NULL;
8+
$except = NULL;
9+
10+
var_dump($read);
11+
stream_select($read, $write, $except, 0);
12+
var_dump($read);
13+
fread(reset($read), 1);
14+
stream_select($read, $write, $except, 0); // // emulate_read
15+
var_dump($read);
16+
?>
17+
--EXPECTF--
18+
array(2) {
19+
[1]=>
20+
resource(%d) of type (stream)
21+
["myindex"]=>
22+
resource(%d) of type (stream)
23+
}
24+
array(2) {
25+
[1]=>
26+
resource(%d) of type (stream)
27+
["myindex"]=>
28+
resource(%d) of type (stream)
29+
}
30+
array(2) {
31+
[1]=>
32+
resource(%d) of type (stream)
33+
["myindex"]=>
34+
resource(%d) of type (stream)
35+
}

0 commit comments

Comments
 (0)