Prevent reentrant PDOStatement operations#22739
Open
iliaal wants to merge 1 commit into
Open
Conversation
Reject same-statement reentry while PDO traverses or mutates live binding and fetch state. Keep the guard across Fiber suspension and invalidate weak references before callback-capable statement teardown.
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.
PDO core runs userland PHP while holding or mutating a statement's live binding and fetch state (object parameter stringification, bound-value destructors, error/fetch/output handlers). That code can reenter the same statement's
execute()orbind*()and free the hash or parameter the outer call is still using, a use-after-free in pure PDO core affecting every driver (confirmed on pdo_sqlite and pdo_odbc under debug+ASan,USE_ZEND_ALLOC=0). Minimal reproducer, UAF inreally_register_bound_param:A per-statement guard rejects reentry into any binding or fetch operation already in progress, throwing an
Error; it holds across Fiber suspension and invalidates weak references before callback-capable teardown. The flag reuses a sparepdo_stmt_treserved bit, so size and offsets are unchanged; since that edits the driver-facing header, master only.