Skip to content

Fix GH-19983: GC assertion failure with fibers, generators and destructors#21529

Closed
iliaal wants to merge 1 commit intophp:PHP-8.4from
iliaal:fix/gh-19983-gc-dtor-fiber-exception-84
Closed

Fix GH-19983: GC assertion failure with fibers, generators and destructors#21529
iliaal wants to merge 1 commit intophp:PHP-8.4from
iliaal:fix/gh-19983-gc-dtor-fiber-exception-84

Conversation

@iliaal
Copy link
Contributor

@iliaal iliaal commented Mar 25, 2026

When GC runs inside a fiber handling an exception (e.g. during zend_fiber_object_destroy), EG(exception) is set. gc_call_destructors_in_fiber() saved and cleared the exception after creating the destructor fiber. Since zend_call_function() returns early when EG(exception) is set, the destructor fiber's handler never ran, leaving DTOR_GARBAGE entries in the root buffer. On the next GC cycle, gc_collect_roots() hit an alignment assertion on these stale entries.

Move remember_prev_exception() before the destructor fiber creation/resume so EG(exception) is cleared before zend_call_function() runs inside the fiber.

Fixes #19983

…tructors

When GC runs inside a fiber handling an exception (e.g. during
zend_fiber_object_destroy), EG(exception) is set.
gc_call_destructors_in_fiber() saved and cleared the exception after
creating the destructor fiber. Since zend_call_function() returns early
when EG(exception) is set, the destructor fiber's handler never ran,
leaving DTOR_GARBAGE entries in the root buffer. On the next GC cycle,
gc_collect_roots() hit an alignment assertion on these stale entries.

Move remember_prev_exception() before the destructor fiber
creation/resume so EG(exception) is cleared before zend_call_function()
runs inside the fiber.

Closes phpGH-19983
@iliaal
Copy link
Contributor Author

iliaal commented Mar 25, 2026

@arnaud-lb Rebase kinda went nuts, so rather then figuring it out closed old PR and made a new one...

@arnaud-lb arnaud-lb closed this in b15c597 Mar 26, 2026
@arnaud-lb
Copy link
Member

Thank you!

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.

2 participants