mirror of
https://github.com/php/php-src.git
synced 2025-08-15 21:48:51 +02:00
Merge branch 'PHP-8.3'
* PHP-8.3: Fix OSS Fuzz #61865: Undef variable in ++/-- for declared property that is unset in error handler
This commit is contained in:
commit
2d3bff38bb
7 changed files with 123 additions and 1 deletions
|
@ -0,0 +1,18 @@
|
|||
--TEST--
|
||||
OSS Fuzz #61865: Undef variable in ++/-- for declared property that is unset in error handler
|
||||
--FILE--
|
||||
<?php
|
||||
class C {
|
||||
public $a;
|
||||
function errorHandler($errno, $errstr) {
|
||||
unset($this->a);
|
||||
}
|
||||
}
|
||||
$c = new C;
|
||||
set_error_handler([$c,'errorHandler']);
|
||||
unset($c->a);
|
||||
$c->a += 5;
|
||||
var_dump($c->a);
|
||||
?>
|
||||
--EXPECT--
|
||||
int(5)
|
|
@ -0,0 +1,20 @@
|
|||
--TEST--
|
||||
OSS Fuzz #61865: Undef variable in ++/-- for declared property that is unset in error handler
|
||||
--FILE--
|
||||
<?php
|
||||
class C {
|
||||
public $a;
|
||||
function errorHandler($errno, $errstr) {
|
||||
unset($this->a);
|
||||
}
|
||||
}
|
||||
$c = new C;
|
||||
set_error_handler([$c,'errorHandler']);
|
||||
unset($c->a);
|
||||
$v = ($c->a--);
|
||||
var_dump($c->a);
|
||||
var_dump($v);
|
||||
?>
|
||||
--EXPECT--
|
||||
NULL
|
||||
NULL
|
|
@ -0,0 +1,20 @@
|
|||
--TEST--
|
||||
OSS Fuzz #61865: Undef variable in ++/-- for declared property that is unset in error handler
|
||||
--FILE--
|
||||
<?php
|
||||
class C {
|
||||
public $a;
|
||||
function errorHandler($errno, $errstr) {
|
||||
unset($this->a);
|
||||
}
|
||||
}
|
||||
$c = new C;
|
||||
set_error_handler([$c,'errorHandler']);
|
||||
unset($c->a);
|
||||
$v = ($c->a++);
|
||||
var_dump($c->a);
|
||||
var_dump($v);
|
||||
?>
|
||||
--EXPECT--
|
||||
int(1)
|
||||
NULL
|
|
@ -0,0 +1,18 @@
|
|||
--TEST--
|
||||
OSS Fuzz #61865: Undef variable in ++/-- for declared property that is unset in error handler
|
||||
--FILE--
|
||||
<?php
|
||||
class C {
|
||||
public $a;
|
||||
function errorHandler($errno, $errstr) {
|
||||
unset($this->a);
|
||||
}
|
||||
}
|
||||
$c = new C;
|
||||
set_error_handler([$c,'errorHandler']);
|
||||
unset($c->a);
|
||||
(--$c->a);
|
||||
var_dump($c->a);
|
||||
?>
|
||||
--EXPECT--
|
||||
NULL
|
|
@ -0,0 +1,18 @@
|
|||
--TEST--
|
||||
OSS Fuzz #61865: Undef variable in ++/-- for declared property that is unset in error handler
|
||||
--FILE--
|
||||
<?php
|
||||
class C {
|
||||
public $a;
|
||||
function errorHandler($errno, $errstr) {
|
||||
unset($this->a);
|
||||
}
|
||||
}
|
||||
$c = new C;
|
||||
set_error_handler([$c,'errorHandler']);
|
||||
unset($c->a);
|
||||
(++$c->a);
|
||||
var_dump($c->a);
|
||||
?>
|
||||
--EXPECT--
|
||||
int(1)
|
|
@ -0,0 +1,25 @@
|
|||
--TEST--
|
||||
Unset declared property converted to object in error handler
|
||||
--FILE--
|
||||
<?php
|
||||
class C {
|
||||
public $a;
|
||||
function errorHandler() {
|
||||
$this->a = new stdClass();
|
||||
}
|
||||
}
|
||||
$c = new C;
|
||||
set_error_handler([$c,'errorHandler']);
|
||||
unset($c->a);
|
||||
|
||||
try {
|
||||
(++$c->a);
|
||||
} catch (\TypeError $e) {
|
||||
echo $e->getMessage(), PHP_EOL;
|
||||
}
|
||||
var_dump($c->a);
|
||||
?>
|
||||
--EXPECT--
|
||||
Cannot increment stdClass
|
||||
object(stdClass)#2 (0) {
|
||||
}
|
|
@ -1117,8 +1117,11 @@ ZEND_API zval *zend_std_get_property_ptr_ptr(zend_object *zobj, zend_string *nam
|
|||
ZSTR_VAL(name));
|
||||
retval = &EG(error_zval);
|
||||
} else {
|
||||
ZVAL_NULL(retval);
|
||||
zend_error(E_WARNING, "Undefined property: %s::$%s", ZSTR_VAL(zobj->ce->name), ZSTR_VAL(name));
|
||||
/* An error handler may set the property */
|
||||
if (EXPECTED(Z_TYPE_P(retval) == IS_UNDEF)) {
|
||||
ZVAL_NULL(retval);
|
||||
}
|
||||
}
|
||||
} else if (prop_info && UNEXPECTED(prop_info->flags & ZEND_ACC_READONLY)) {
|
||||
/* Readonly property, delegate to read_property + write_property. */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue