Merge branch 'PHP-8.4'

* PHP-8.4:
  Fix get_object_vars() for non-hooked props in hooked prop iter
This commit is contained in:
Ilija Tovilo 2024-11-18 16:20:33 +01:00
commit bd5939d57e
No known key found for this signature in database
GPG key ID: 5050C66BFCD1015A
2 changed files with 29 additions and 1 deletions

27
Zend/tests/gh16725.phpt Normal file
View file

@ -0,0 +1,27 @@
--TEST--
GH-16725: Incorrect access check for non-hooked props in hooked object iterator
--FILE--
<?php
class C implements JsonSerializable
{
private string $prop1 { get => 'bar'; }
public function __construct(
private string $prop2,
) {}
public function jsonSerialize(): mixed {
return get_object_vars($this);
}
}
$obj = new C('foo');
var_dump(get_object_vars($obj));
echo json_encode($obj);
?>
--EXPECT--
array(0) {
}
{"prop1":"bar","prop2":"foo"}

View file

@ -89,7 +89,8 @@ static zend_array *zho_build_properties_ex(zend_object *zobj, bool check_access,
if (UNEXPECTED(Z_TYPE_P(OBJ_PROP(zobj, prop_info->offset)) == IS_UNDEF)) { if (UNEXPECTED(Z_TYPE_P(OBJ_PROP(zobj, prop_info->offset)) == IS_UNDEF)) {
HT_FLAGS(properties) |= HASH_FLAG_HAS_EMPTY_IND; HT_FLAGS(properties) |= HASH_FLAG_HAS_EMPTY_IND;
} }
zend_hash_update_ind(properties, property_name, OBJ_PROP(zobj, prop_info->offset)); zval *tmp = zend_hash_lookup(properties, property_name);
ZVAL_INDIRECT(tmp, OBJ_PROP(zobj, prop_info->offset));
} }
skip_property: skip_property:
if (property_name != prop_info->name) { if (property_name != prop_info->name) {