Skip to content

Commit 4b930e1

Browse files
committed
Merge branch 'PHP-5.5' into PHP-5.6
2 parents 8cc8d48 + a9d73f0 commit 4b930e1

File tree

5 files changed

+53
-7
lines changed

5 files changed

+53
-7
lines changed

NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
. Fixed bug #68917 (parse_url fails on some partial urls). (Wei Dai)
99
. Fixed bug #69212 (Leaking VIA_HANDLER func when exception thrown in
1010
__call/... arg passing). (Nikita)
11+
. Fixed bug #69221 (Segmentation fault when using a generator in combination
12+
with an Iterator). (Nikita)
1113

1214
- Filter:
1315
. Fixed bug #69202: (FILTER_FLAG_STRIP_BACKTICK ignored unless other

Zend/tests/bug69221.phpt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
--TEST--
2+
Bug #69221: Segmentation fault when using a generator in combination with an Iterator
3+
--FILE--
4+
<?php
5+
6+
function gen() {
7+
yield 1;
8+
};
9+
10+
$gen1 = gen();
11+
$gen2 = (object) $gen1;
12+
13+
foreach ($gen1 as $v1) {
14+
foreach ($gen2 as $v2) {
15+
break 2;
16+
}
17+
}
18+
19+
unset($gen1);
20+
foreach ($gen2 as $v) { var_dump($v); }
21+
22+
?>
23+
--EXPECTF--
24+
int(1)

Zend/tests/bug69221_2.phpt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
--TEST--
2+
Bug #69221: Segmentation fault when using a generator in combination with an Iterator (2)
3+
--FILE--
4+
<?php
5+
6+
$gen = function() {
7+
yield 1;
8+
};
9+
10+
$iter = new IteratorIterator($gen());
11+
$ngen = $iter->getInnerIterator();
12+
13+
var_dump(iterator_to_array($ngen, false));
14+
15+
?>
16+
--EXPECT--
17+
array(1) {
18+
[0]=>
19+
int(1)
20+
}

Zend/zend_generators.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -605,9 +605,9 @@ ZEND_METHOD(Generator, __wakeup)
605605

606606
static void zend_generator_iterator_dtor(zend_object_iterator *iterator TSRMLS_DC) /* {{{ */
607607
{
608-
zval *object = ((zend_generator_iterator *) iterator)->object;
608+
zend_generator_iterator *iter = (zend_generator_iterator *) iterator;
609609

610-
zval_ptr_dtor(&object);
610+
zend_objects_store_del_ref_by_handle(iter->handle TSRMLS_CC);
611611
}
612612
/* }}} */
613613

@@ -699,8 +699,8 @@ zend_object_iterator *zend_generator_get_iterator(zend_class_entry *ce, zval *ob
699699

700700
/* We have to keep a reference to the generator object zval around,
701701
* otherwise the generator may be destroyed during iteration. */
702-
Z_ADDREF_P(object);
703-
iterator->object = object;
702+
iterator->handle = Z_OBJ_HANDLE_P(object);
703+
zend_objects_store_add_ref_by_handle(iterator->handle TSRMLS_CC);
704704

705705
return (zend_object_iterator *) iterator;
706706
}

Zend/zend_generators.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ extern ZEND_API zend_class_entry *zend_ce_generator;
2828
typedef struct _zend_generator_iterator {
2929
zend_object_iterator intern;
3030

31-
/* The generator object zval has to be stored, because the iterator is
32-
* holding a ref to it, which has to be dtored. */
33-
zval *object;
31+
/* The generator object handle has to be stored, because the
32+
* iterator is holding a ref to it, which has to be dtored. */
33+
zend_object_handle handle;
3434
} zend_generator_iterator;
3535

3636
typedef struct _zend_generator {

0 commit comments

Comments
 (0)