From 5b4591db13c033b43554e1c6d5c9b83077384f0b Mon Sep 17 00:00:00 2001 From: twosee Date: Sat, 5 Jun 2021 15:10:31 +0800 Subject: [PATCH] Fix undefined return value of fiber after bailout --- .../fibers/get-return-after-bailout.phpt | 25 +++++++++++++++++++ Zend/zend_fibers.c | 2 ++ 2 files changed, 27 insertions(+) create mode 100644 Zend/tests/fibers/get-return-after-bailout.phpt diff --git a/Zend/tests/fibers/get-return-after-bailout.phpt b/Zend/tests/fibers/get-return-after-bailout.phpt new file mode 100644 index 0000000000000..0f004070251b5 --- /dev/null +++ b/Zend/tests/fibers/get-return-after-bailout.phpt @@ -0,0 +1,25 @@ +--TEST-- +Fiber::getReturn() after bailout +--FILE-- +getReturn()); +}); + +$fiber = new Fiber(static function (): void { + str_repeat('X', PHP_INT_MAX); +}); +$fiber->start(); + +?> +--EXPECTF-- +Fatal error: Allowed memory size of %d bytes exhausted%s(tried to allocate %d bytes) %sget-return-after-bailout.php on line %d + +Fatal error: Uncaught FiberError: Cannot get fiber return value: The fiber exited with a fatal error in %sget-return-after-bailout.php:%d +Stack trace: +#0 %sget-return-after-bailout.php(%d): Fiber->getReturn() +#1 [internal function]: {closure}() +#2 {main} + thrown in %sget-return-after-bailout.php on line %d diff --git a/Zend/zend_fibers.c b/Zend/zend_fibers.c index 928cb4499bc4f..66e38597afb3e 100644 --- a/Zend/zend_fibers.c +++ b/Zend/zend_fibers.c @@ -673,6 +673,8 @@ ZEND_METHOD(Fiber, getReturn) if (fiber->status == ZEND_FIBER_STATUS_DEAD) { if (fiber->flags & ZEND_FIBER_FLAG_THREW) { message = "The fiber threw an exception"; + } else if (fiber->flags & ZEND_FIBER_FLAG_BAILOUT) { + message = "The fiber exited with a fatal error"; } else { RETURN_COPY(&fiber->value); }