Skip to content

Commit 9501613

Browse files
committed
Fix phpGH-10496: Fibers must not be garbage collected while implicitly suspended by resumption of another fiber
1 parent d721dcc commit 9501613

File tree

3 files changed

+28
-2
lines changed

3 files changed

+28
-2
lines changed

Zend/tests/fibers/gh10496.phpt renamed to Zend/tests/fibers/gh10496-001.phpt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
--TEST--
2-
Bug GH-10496 (Segfault when garbage collector is invoked inside of fiber)
2+
Bug GH-10496 001 (Segfault when garbage collector is invoked inside of fiber)
33
--FILE--
44
<?php
55

Zend/tests/fibers/gh10496-002.phpt

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
--TEST--
2+
Bug GH-10496 002 (Segfault when garbage collector is invoked inside of fiber)
3+
--FILE--
4+
<?php
5+
6+
function pollute_stack_and_suspend($a = 1, $b = 2, $c = 3) {
7+
Fiber::suspend();
8+
}
9+
10+
$f = new Fiber(function() use (&$f) {
11+
pollute_stack_and_suspend();
12+
(function() {
13+
(function() {
14+
(new Fiber(function() {
15+
gc_collect_cycles();
16+
echo "Success\n";
17+
}))->start();
18+
})();
19+
})();
20+
});
21+
$f->start();
22+
$f->resume();
23+
24+
?>
25+
--EXPECT--
26+
Success

Zend/zend_fibers.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -644,7 +644,7 @@ static HashTable *zend_fiber_object_gc(zend_object *object, zval **table, int *n
644644
zend_get_gc_buffer_add_zval(buf, &fiber->fci.function_name);
645645
zend_get_gc_buffer_add_zval(buf, &fiber->result);
646646

647-
if (fiber->context.status != ZEND_FIBER_STATUS_SUSPENDED) {
647+
if (fiber->context.status != ZEND_FIBER_STATUS_SUSPENDED || fiber->caller != NULL) {
648648
zend_get_gc_buffer_use(buf, table, num);
649649
return NULL;
650650
}

0 commit comments

Comments
 (0)