Fix GH-19983: GC assertion failure with fibers, generators and destructors#21527
Closed
iliaal wants to merge 4514 commits intophp:PHP-8.4from
Closed
Fix GH-19983: GC assertion failure with fibers, generators and destructors#21527iliaal wants to merge 4514 commits intophp:PHP-8.4from
iliaal wants to merge 4514 commits intophp:PHP-8.4from
Conversation
* PHP-8.4: Fix benchmarking head sha Fix ccache for alpine and msan Fix coverage label job selection Fix ccache for coverage and pecl builds
* PHP-8.5: Fix benchmarking head sha Fix ccache for alpine and msan Fix coverage label job selection Fix ccache for coverage and pecl builds
* PHP-8.4: Update IR (php#21288)
* PHP-8.5: Update IR (php#21288)
* PHP-8.5: PHP-8.5 is now for PHP 8.5.5-dev
* PHP-8.4: Fix preloaded constant erroneously propagated to file-cached script
* PHP-8.5: Fix preloaded constant erroneously propagated to file-cached script
* PHP-8.5: Fix missed php_version changes
* PHP-8.4: ext/pcre: preg_match() fix memory leak with invalid regexes.
* PHP-8.5: ext/pcre: preg_match() fix memory leak with invalid regexes.
* PHP-8.4: php_version.h: remove trailing whitespace
* PHP-8.5: php_version.h: remove trailing whitespace
* PHP-8.4: Update IR
* PHP-8.5: Update IR
… error (php#21260) When a PCRE execution error occurs (e.g. malformed UTF-8 with /u modifier), preg_grep() was returning a partial result array containing only the entries processed before the error. All other preg_* functions return false on execution errors. After the match loop, check PCRE_G(error_code) and if an error occurred, destroy the partial array and return false instead. Fixes phpGH-11936
Instead of hardcoding the file extensions for shared PHP extensions (which in most cases are '.so', or '.dll'), this uses file extension for the current PHP build as it was defined during the configure/build phase. There can be systems where some other file extension is used for shared modules.
internal refactorings: - pcntl_signal_get_handler() max signals handling simplification, reusing the num_signals global. - pcntl_alarm() accepts a zend_long (signed) but passes it to alarm(), which takes an unsigned int. Negative values silently wrap to large unsigned values, scheduling an alarm far in the future instead of raising an error. Also reject large values above unsigned long max value. close phpGH-21282
* PHP-8.4: ext/pcre: fix memory leaks on error paths
* PHP-8.5: ext/pcre: fix memory leaks on error paths
* PHP-8.5: ext/pcre: fix new pcre2 test
Add support for new functions present in recent libsodium versions: - Functions for IP address encryption: - sodium_crypto_ipcrypt_* - sodium_bin2ip/sodium_ip2bin helpers - Extendable output functions: - SHAKE128/SHAKE256 - TurboSHAKE128/TurboSHAKE256
* PHP-8.4: [CI][skip ci] Fix benchmarking summary
* PHP-8.5: [CI][skip ci] Fix benchmarking summary
* PHP-8.4: PHP-8.4 is now for PHP 8.4.21-dev
* PHP-8.5: PHP-8.4 is now for PHP 8.4.21-dev
…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
arnaud-lb
approved these changes
Mar 25, 2026
Member
arnaud-lb
left a comment
There was a problem hiding this comment.
Thank you! This looks good to me.
Could you rebase on PHP-8.4?
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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. Sincezend_call_function()returns early whenEG(exception)is set, the destructor fiber's handler never ran, leavingDTOR_GARBAGEentries 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 soEG(exception)is cleared beforezend_call_function()runs inside the fiber.Fixes #19983