mirror of
https://github.com/php/php-src.git
synced 2026-03-24 00:02:20 +01:00
zend_std_get_property_ptr_ptr() was the only property handler that did
not propagate the IN_GET guard to the underlying object when forwarding
from a lazy proxy after initialization. This caused __get to be called
on the underlying object when it shouldn't be, leading to assertion
failures.
The same guard-copying pattern already existed in read_property,
write_property, unset_property, and has_property since commit
26f5009e91 (GH-18039).
Also fixes GH-20873 and GH-20854.
Closes GH-20875
31 lines
800 B
PHP
31 lines
800 B
PHP
--TEST--
|
|
GH-20873 (Assertion failure in _zendi_try_convert_scalar_to_number with lazy proxy)
|
|
--FILE--
|
|
<?php
|
|
class A {
|
|
public $_;
|
|
public function __get($n) {
|
|
global $obj;
|
|
$obj->x =& $this->_;
|
|
static $a = $a;
|
|
$e =& $this->_ - $a;
|
|
}
|
|
}
|
|
$rc = new ReflectionClass(A::class);
|
|
$obj = $rc->newLazyProxy(fn() => new A);
|
|
$rc->initializeLazyObject($obj);
|
|
var_dump($obj->p);
|
|
?>
|
|
--EXPECTF--
|
|
Deprecated: Creation of dynamic property A::$x is deprecated in %s on line %d
|
|
|
|
Warning: Undefined variable $a in %s on line %d
|
|
|
|
Notice: Indirect modification of overloaded property A::$x has no effect in %s on line %d
|
|
|
|
Fatal error: Uncaught Error: Cannot assign by reference to overloaded object in %s:%d
|
|
Stack trace:
|
|
#0 %s(%d): A->__get('p')
|
|
#1 {main}
|
|
thrown in %s on line %d
|