Workaround ZTS persistent resource crashes (PHP 8.3 and lower)#13388
Closed
ndossche wants to merge 3 commits intophp:PHP-8.2from
Closed
Workaround ZTS persistent resource crashes (PHP 8.3 and lower)#13388ndossche wants to merge 3 commits intophp:PHP-8.2from
ndossche wants to merge 3 commits intophp:PHP-8.2from
Conversation
For master (8.4-dev) I merged phpGH-13381. But that PR changes public API of TSRM, so cannot be used on lower branches. This patch is a safe workaround for the issue, in combination with a pre-existing fix using `ifdef ZTS + if (module_started)` inside pgsql and odbc. The idea is to delay unloading modules until the persistent resources are destroyed. This will keep the destructor code accessible in memory. This is not a proper fix on its own, because we still need the workaround of not accessing globals after module destruction. The proper fix is in master.
dstogov
reviewed
Feb 19, 2024
Member
dstogov
left a comment
There was a problem hiding this comment.
I think, the patch is good on its own. And it may make sense to merge it to master as well.
May be it make sense to move zend_collect_dl_loaded_module_entries() code into zend_collect_module_handlers(), to do this uniformly.
0aaa062 to
27a9626
Compare
27a9626 to
611fe96
Compare
ndossche
commented
Feb 19, 2024
| module_request_shutdown_handlers[shutdown_count] = NULL; | ||
| module_post_deactivate_handlers = module_request_shutdown_handlers + shutdown_count + 1; | ||
| module_post_deactivate_handlers[post_deactivate_count] = NULL; | ||
| /* Cannot reuse module_request_startup_handlers because it is freed in zend_destroy_modules, which happens before zend_unload_modules. */ |
Member
Author
There was a problem hiding this comment.
It is possible to move freeing module_request_startup_handlers to zend_unload_modules, but that changes public API.
And we want to avoid that in stable branches. The reason for this different workaround for lower branches was to avoid changing the public API in the first place.
dstogov
approved these changes
Feb 20, 2024
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.
For master (8.4-dev) I merged GH-13381. But that PR changes public API of TSRM, so cannot be used on lower branches.
This patch is a safe workaround for the issue with dynamic loaded modules, in combination with a existing fix using
ifdef ZTS + if (module_started)inside pgsql and odbc. The idea is to delay unloading modules until the persistent resources are destroyed. This will keep the destructor code accessible in memory.This is not a proper fix on its own, because we still need the workaround of not accessing globals after module destruction. The proper fix is in master.
Note:
module_registry_unload_tempdoes not exist.