Skip to content

Commit aca2322

Browse files
committed
Merge branch 'PHP-8.2' into PHP-8.3
* PHP-8.2: Fix use-after-free in property coercion with __toString()
2 parents 02a60be + 8c312ba commit aca2322

File tree

3 files changed

+51
-2
lines changed

3 files changed

+51
-2
lines changed

NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ PHP NEWS
1010
(nielsdos)
1111
. Fixed OSS-Fuzz #69765. (nielsdos)
1212
. Fixed bug GH-14741 (Segmentation fault in Zend/zend_types.h). (nielsdos)
13+
. Fixed bug GH-14969 (Use-after-free in property coercion with __toString()).
14+
(ilutov)
1315

1416
- Dom:
1517
. Fixed bug GH-14702 (DOMDocument::xinclude() crash). (nielsdos)

Zend/tests/gh14969.phpt

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
--TEST--
2+
GH-14969: Crash on coercion with throwing __toString()
3+
--FILE--
4+
<?php
5+
6+
class C {
7+
public function __toString() {
8+
global $c;
9+
$c = [];
10+
throw new Exception(__METHOD__);
11+
}
12+
}
13+
14+
class D {
15+
public string $prop;
16+
}
17+
18+
$c = new C();
19+
$d = new D();
20+
try {
21+
$d->prop = $c;
22+
} catch (Throwable $e) {
23+
echo $e->getMessage(), "\n";
24+
}
25+
var_dump($d);
26+
27+
$c = new C();
28+
$d->prop = 'foo';
29+
try {
30+
$d->prop = $c;
31+
} catch (Throwable $e) {
32+
echo $e->getMessage(), "\n";
33+
}
34+
var_dump($d);
35+
36+
?>
37+
--EXPECTF--
38+
C::__toString
39+
object(D)#%d (0) {
40+
["prop"]=>
41+
uninitialized(string)
42+
}
43+
C::__toString
44+
object(D)#2 (1) {
45+
["prop"]=>
46+
string(3) "foo"
47+
}

Zend/zend_object_handlers.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -846,7 +846,7 @@ ZEND_API zval *zend_std_write_property(zend_object *zobj, zend_string *name, zva
846846
goto exit;
847847
}
848848
if (UNEXPECTED(!type_matched)) {
849-
Z_TRY_DELREF_P(value);
849+
zval_ptr_dtor(&tmp);
850850
variable_ptr = &EG(error_zval);
851851
goto exit;
852852
}
@@ -949,7 +949,7 @@ found:;
949949
goto exit;
950950
}
951951
if (UNEXPECTED(!type_matched)) {
952-
zval_ptr_dtor(value);
952+
zval_ptr_dtor(&tmp);
953953
goto exit;
954954
}
955955
value = &tmp;

0 commit comments

Comments
 (0)