Fix GH-20503: Assertion failure with ext/date DateInterval property hash construction #20720
+94
−0
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 a DateInterval object has a circular reference (e.g.,
$obj->prop = $obj), callingjson_encode()triggers an assertion failure in debug builds. This happens because theget_propertieshandler modifies the properties HashTable in place, but circular references cause the HashTable to have a refcount > 1, which violates the assertion inzend_hash_str_update().The fix adds a
get_properties_forhandler for DateInterval that returns a duplicated HashTable. To ensure circular reference detection still works (which relies on HashTable identity), the duplicated HashTable is cached in module globals, keyed by object handle. When we detect a recursive call (cache entry exists with refcount > 1), we return the same cached HashTable so thatGC_IS_RECURSIVEcan properly detect the cycle.This approach avoids any ABI break by using module globals instead of adding a field to
php_interval_obj.Fixes GH-20503