Skip to content

Commit e2e770c

Browse files
authored
Fix undefined return value of fiber after bailout (#7103)
1 parent 42dbd1f commit e2e770c

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
--TEST--
2+
Fiber::getReturn() after bailout
3+
--FILE--
4+
<?php
5+
6+
register_shutdown_function(static function (): void {
7+
global $fiber;
8+
var_dump($fiber->getReturn());
9+
});
10+
11+
$fiber = new Fiber(static function (): void {
12+
str_repeat('X', PHP_INT_MAX);
13+
});
14+
$fiber->start();
15+
16+
?>
17+
--EXPECTF--
18+
Fatal error: Allowed memory size of %d bytes exhausted%s(tried to allocate %d bytes) %sget-return-after-bailout.php on line %d
19+
20+
Fatal error: Uncaught FiberError: Cannot get fiber return value: The fiber exited with a fatal error in %sget-return-after-bailout.php:%d
21+
Stack trace:
22+
#0 %sget-return-after-bailout.php(%d): Fiber->getReturn()
23+
#1 [internal function]: {closure}()
24+
#2 {main}
25+
thrown in %sget-return-after-bailout.php on line %d

Zend/zend_fibers.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -673,6 +673,8 @@ ZEND_METHOD(Fiber, getReturn)
673673
if (fiber->status == ZEND_FIBER_STATUS_DEAD) {
674674
if (fiber->flags & ZEND_FIBER_FLAG_THREW) {
675675
message = "The fiber threw an exception";
676+
} else if (fiber->flags & ZEND_FIBER_FLAG_BAILOUT) {
677+
message = "The fiber exited with a fatal error";
676678
} else {
677679
RETURN_COPY(&fiber->value);
678680
}

0 commit comments

Comments
 (0)