Skip to content

Commit 9830204

Browse files
authored
Handle non-INDIRECT symbol table entries in zend_fiber_object_gc() (#10386)
Fixes GH-10340
1 parent a8c8fb2 commit 9830204

File tree

4 files changed

+80
-2
lines changed

4 files changed

+80
-2
lines changed

Zend/tests/fibers/gh10340-001.phpt

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
--TEST--
2+
Bug GH-10340 001 (Assertion in zend_fiber_object_gc())
3+
--FILE--
4+
<?php
5+
function f() {
6+
$$y = Fiber::getCurrent();
7+
Fiber::suspend();
8+
}
9+
$fiber = new Fiber(function() {
10+
get_defined_vars();
11+
f();
12+
});
13+
$fiber->start();
14+
gc_collect_cycles();
15+
?>
16+
==DONE==
17+
--EXPECTF--
18+
Warning: Undefined variable $y in %s on line %d
19+
==DONE==

Zend/tests/fibers/gh10340-002.phpt

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
--TEST--
2+
Bug GH-10340 002 (Assertion in zend_fiber_object_gc())
3+
--FILE--
4+
<?php
5+
function f() {
6+
$y = 'a';
7+
$$y = Fiber::getCurrent();
8+
Fiber::suspend();
9+
}
10+
$fiber = new Fiber(function() {
11+
get_defined_vars();
12+
f();
13+
});
14+
$fiber->start();
15+
gc_collect_cycles();
16+
?>
17+
==DONE==
18+
--EXPECT--
19+
==DONE==

Zend/tests/fibers/gh10340-003.phpt

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
--TEST--
2+
Bug GH-10340 003 (Assertion in zend_fiber_object_gc())
3+
--FILE--
4+
<?php
5+
6+
class C {
7+
public function __destruct() {
8+
echo __METHOD__, "\n";
9+
}
10+
}
11+
12+
function f() {
13+
$c = new C();
14+
$y = 'a';
15+
$$y = Fiber::getCurrent();
16+
Fiber::suspend();
17+
}
18+
19+
$fiber = new Fiber(function() {
20+
get_defined_vars();
21+
f();
22+
});
23+
24+
$fiber->start();
25+
26+
print "1\n";
27+
28+
$fiber = null;
29+
gc_collect_cycles();
30+
31+
print "2\n";
32+
?>
33+
==DONE==
34+
--EXPECT--
35+
1
36+
C::__destruct
37+
2
38+
==DONE==

Zend/zend_fibers.c

+4-2
Original file line numberDiff line numberDiff line change
@@ -656,8 +656,10 @@ static HashTable *zend_fiber_object_gc(zend_object *object, zval **table, int *n
656656
if (lastSymTable) {
657657
zval *val;
658658
ZEND_HASH_FOREACH_VAL(lastSymTable, val) {
659-
ZEND_ASSERT(Z_TYPE_P(val) == IS_INDIRECT);
660-
zend_get_gc_buffer_add_zval(buf, Z_INDIRECT_P(val));
659+
if (EXPECTED(Z_TYPE_P(val) == IS_INDIRECT)) {
660+
val = Z_INDIRECT_P(val);
661+
}
662+
zend_get_gc_buffer_add_zval(buf, val);
661663
} ZEND_HASH_FOREACH_END();
662664
}
663665
lastSymTable = symTable;

0 commit comments

Comments
 (0)