mirror of
https://github.com/php/php-src.git
synced 2024-11-26 19:33:55 +08:00
Fix assertion failure in zend_std_read_property
We asserted that Z_PROP_FLAG_P(retval) was exactly IS_PROP_UNINIT, but this is a bit field and it may contain irrelevant bits. For instance it may contain IS_PROP_REINITABLE during clone, or IS_PROP_LAZY if the object is lazy. Fixes GH-16615 Closes GH-16639
This commit is contained in:
parent
ef56241483
commit
3d3b22ddf2
1
NEWS
1
NEWS
@ -7,6 +7,7 @@ PHP NEWS
|
||||
(nielsdos)
|
||||
. Fixed bug GH-16577 (EG(strtod_state).freelist leaks with opcache.preload).
|
||||
(nielsdos)
|
||||
. Fixed bug GH-16615 (Assertion failure in zend_std_read_property). (Arnaud)
|
||||
|
||||
- DOM:
|
||||
. Fixed bug GH-16594 (Assertion failure in DOM -> before). (nielsdos)
|
||||
|
23
Zend/tests/gh16615_001.phpt
Normal file
23
Zend/tests/gh16615_001.phpt
Normal file
@ -0,0 +1,23 @@
|
||||
--TEST--
|
||||
GH-16615 001 (Assertion failure in zend_std_read_property)
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
class Foo {
|
||||
public string $bar {
|
||||
set => $value;
|
||||
}
|
||||
}
|
||||
|
||||
$reflector = new ReflectionClass(Foo::class);
|
||||
|
||||
// Adds IS_PROP_LAZY to prop flags
|
||||
$foo = $reflector->newLazyGhost(function ($ghost) {
|
||||
$ghost->bar = 'bar';
|
||||
});
|
||||
|
||||
echo $foo->bar;
|
||||
|
||||
?>
|
||||
--EXPECT--
|
||||
bar
|
24
Zend/tests/gh16615_002.phpt
Normal file
24
Zend/tests/gh16615_002.phpt
Normal file
@ -0,0 +1,24 @@
|
||||
--TEST--
|
||||
GH-16615 002 (Assertion failure in zend_std_read_property)
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
class Foo {
|
||||
public string $bar {
|
||||
set => $value;
|
||||
}
|
||||
public function __clone() {
|
||||
try {
|
||||
echo $this->bar;
|
||||
} catch (Error $e) {
|
||||
printf("%s: %s\n", $e::class, $e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Adds IS_PROP_REINITABLE to prop flags
|
||||
clone new Foo();
|
||||
|
||||
?>
|
||||
--EXPECT--
|
||||
Error: Typed property Foo::$bar must not be accessed before initialization
|
@ -791,7 +791,7 @@ try_again:
|
||||
if (UNEXPECTED(Z_TYPE_P(retval) == IS_UNDEF)) {
|
||||
/* As hooked properties can't be unset, the only way to end up with an undef
|
||||
* value is via an uninitialized property. */
|
||||
ZEND_ASSERT(Z_PROP_FLAG_P(retval) == IS_PROP_UNINIT);
|
||||
ZEND_ASSERT(Z_PROP_FLAG_P(retval) & IS_PROP_UNINIT);
|
||||
goto uninit_error;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user