Skip to content

Commit bdac9ef

Browse files
twosenikic
authored andcommitted
Preserve keys in emulate_read_fd_set()
Keys are already preserved in the non-emulated case.
1 parent d7b5954 commit bdac9ef

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
@@ -710,14 +710,16 @@ static int stream_array_emulate_read_fd_set(zval *stream_array)
710710
zval *elem, *dest_elem, new_array;
711711
php_stream *stream;
712712
int ret = 0;
713+
zend_ulong num_ind;
714+
zend_string *key;
713715

714716
if (Z_TYPE_P(stream_array) != IS_ARRAY) {
715717
return 0;
716718
}
717719
ZVAL_NEW_ARR(&new_array);
718720
zend_hash_init(Z_ARRVAL(new_array), zend_hash_num_elements(Z_ARRVAL_P(stream_array)), NULL, ZVAL_PTR_DTOR, 0);
719721

720-
ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(stream_array), elem) {
722+
ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(stream_array), num_ind, key, elem) {
721723
ZVAL_DEREF(elem);
722724
php_stream_from_zval_no_verify(stream, elem);
723725
if (stream == NULL) {
@@ -730,10 +732,12 @@ static int stream_array_emulate_read_fd_set(zval *stream_array)
730732
* This branch of code also allows blocking streams with buffered data to
731733
* operate correctly in stream_select.
732734
* */
733-
dest_elem = zend_hash_next_index_insert(Z_ARRVAL(new_array), elem);
734-
if (dest_elem) {
735-
zval_add_ref(dest_elem);
735+
if (!key) {
736+
dest_elem = zend_hash_index_update(Z_ARRVAL(new_array), num_ind, elem);
737+
} else {
738+
dest_elem = zend_hash_update(Z_ARRVAL(new_array), key, elem);
736739
}
740+
zval_add_ref(dest_elem);
737741
ret++;
738742
continue;
739743
}
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)