Skip to content

Check the stack limit when calling internal functions#22545

Open
iliaal wants to merge 1 commit into
php:masterfrom
iliaal:gh15672-stack-limit
Open

Check the stack limit when calling internal functions#22545
iliaal wants to merge 1 commit into
php:masterfrom
iliaal:gh15672-stack-limit

Conversation

@iliaal

@iliaal iliaal commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

GH-16492 fixes GH-15911 by guarding AppendIterator against appending to itself; this is the general form. An internal function that recurses through zend_call_function (which invokes internal handlers directly, with no VM frame and no stack-limit check) never yields back to the VM, so the C stack overflows into a SEGV. This adds the interpreter's stack-limit check to that path, behind ZEND_CHECK_STACK_LIMIT, raising the usual "Maximum call stack size reached" error instead. It covers a MultipleIterator (GH-15672) or AppendIterator (GH-15911) attached to itself and a mutual cycle between two such iterators that a per-iterator guard cannot see. For a pure internal-to-internal cycle the error is uncatchable, since there is no user frame in the recursion to unwind into. Fixes #15672 and #15911.

zend_call_function invokes an internal callee's handler directly, with no
VM frame and without the stack-limit check the interpreter runs at its
call opcodes. An internal function that recurses through zend_call_function,
such as a self- or mutually-attached SPL iterator, never yields back to the
VM, so nothing bounds the recursion and the C stack overflows into a SEGV.

Check zend_call_stack_overflowed() in the internal branch behind
ZEND_CHECK_STACK_LIMIT, raise the usual "Maximum call stack size reached"
error on overflow, and tear the just-built call frame down as the normal
return path does.

Fixes phpGH-15672
Fixes phpGH-15911
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Segmentation fault (stack overflow) in AppendIterator Segmentation fault in Zend/zend_execute_API.c

1 participant