Fixed PHP SEGV by not writing to shared memory for zend_class_entry. #9995
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.
Fixes: #9446
The root cause of the SEGV was that we were mutating
zend_class_entry.create_object
As of PHP 8.1, it appears thatzend_class_entry
structs for PHP classes are shared between PHP processes when using php-fpm and opcache. This means that writes tozend_class_entry.create_object
in one process will be visible in another process, which violated our assumption that such writes reads and writes were single-threaded.The fix was to stop mutating
zend_class_entry.create_object
, instead mutating a member of ourPROTOBUF_G()
struct.Unfortunately the setup to reproduce this is somewhat involved, so there is no test at the moment. I tested and verified the fix locally on my machine.