Skip to content

Fix GH-20404: crash when modifying weak references during destruction - #22390

Open
khaledalam wants to merge 1 commit into
php:masterfrom
khaledalam:fix-gh20404-weakmap-dtor-reentrancy
Open

Fix GH-20404: crash when modifying weak references during destruction#22390
khaledalam wants to merge 1 commit into
php:masterfrom
khaledalam:fix-gh20404-weakmap-dtor-reentrancy

Conversation

@khaledalam

@khaledalam khaledalam commented Jun 21, 2026

Copy link
Copy Markdown
Contributor

Fixes GH-20404.

zend_weakrefs_notify() cleared weak references by iterating EG(weakrefs) in place. Clearing an entry can run a user destructor that reentrantly registers (grows/reallocates the HT mid-iteration → UAF) or unregisters pending entries.

Reworked to pop one entry at a time, never holding a cursor across user code. Handles both the new-registration crash and the existing nested-WeakMap unregistration path.

@khaledalam
khaledalam force-pushed the fix-gh20404-weakmap-dtor-reentrancy branch from 2b5f094 to 6810d12 Compare June 24, 2026 21:30
NattyNarwhal added a commit to NattyNarwhal/php-src that referenced this pull request Aug 4, 2026
After phpGH-22390 was merged, we can now use a %pS format specifier for
zend_string without having to use the unchecked variant (so that gcc et
al doesn't complain that %S should be for wchar_t*).
NattyNarwhal added a commit that referenced this pull request Aug 4, 2026
* standard: remove sole user of php_error_docref_unchecked

After GH-22390 was merged, we can now use a %pS format specifier for
zend_string without having to use the unchecked variant (so that gcc et
al doesn't complain that %S should be for wchar_t*).

* main: Remove php_error_docref_unchecked

There are no external users AFAIK, and now no internal users.
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.

Crash when adding object to WeakMap during destruction

1 participant