Skip to content

Commit 833b45a

Browse files
nielsdosdevnexen
authored andcommitted
Fix GH-10249: Assertion `size >= page_size + 1 * page_size' failed.
Co-authored-by: Changochen <[email protected]> Closes GH-10284
1 parent 0116864 commit 833b45a

File tree

3 files changed

+25
-1
lines changed

3 files changed

+25
-1
lines changed

NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ PHP NEWS
1616
. Fixed bug GH-10218 (DateTimeZone fails to parse time zones that contain the
1717
"+" character). (Derick)
1818

19+
- Fiber:
20+
. Fix assertion on stack allocation size. (nielsdos)
21+
1922
- FPM:
2023
. Fixed bug GH-9981 (FPM does not reset fastcgi.error_header).
2124
(Jakub Zelenka)

Zend/tests/fibers/gh10249.phpt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
--TEST--
2+
GH-10249 (Assertion `size >= page_size + 1 * page_size' failed.)
3+
--FILE--
4+
<?php
5+
6+
$callback = function () {};
7+
ini_set("fiber.stack_size", "");
8+
$fiber = new Fiber($callback);
9+
try {
10+
$fiber->start();
11+
} catch (Exception $e) {
12+
echo $e->getMessage() . "\n";
13+
}
14+
15+
?>
16+
--EXPECTF--
17+
Fiber stack size is too small, it needs to be at least %d bytes

Zend/zend_fibers.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,8 +174,12 @@ static zend_fiber_stack *zend_fiber_stack_allocate(size_t size)
174174
{
175175
void *pointer;
176176
const size_t page_size = zend_fiber_get_page_size();
177+
const size_t minimum_stack_size = page_size + ZEND_FIBER_GUARD_PAGES * page_size;
177178

178-
ZEND_ASSERT(size >= page_size + ZEND_FIBER_GUARD_PAGES * page_size);
179+
if (size < minimum_stack_size) {
180+
zend_throw_exception_ex(NULL, 0, "Fiber stack size is too small, it needs to be at least %zu bytes", minimum_stack_size);
181+
return NULL;
182+
}
179183

180184
const size_t stack_size = (size + page_size - 1) / page_size * page_size;
181185
const size_t alloc_size = stack_size + ZEND_FIBER_GUARD_PAGES * page_size;

0 commit comments

Comments
 (0)