Skip to content

Commit bc7d00e

Browse files
committed
Merge branch 'PHP-8.4'
* PHP-8.4: Fix use after free during shutdown destruction
2 parents 412d691 + bb6263a commit bc7d00e

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

Zend/tests/gh18833.phpt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
--TEST--
2+
GH-18833 (Use after free with weakmaps dependent on destruction order)
3+
--FILE--
4+
<?php
5+
6+
class a {
7+
public static WeakMap $map;
8+
public static Generator $storage;
9+
}
10+
11+
a::$map = new WeakMap;
12+
13+
$closure = function () {
14+
$obj = new a;
15+
a::$map[$obj] = true;
16+
yield $obj;
17+
};
18+
a::$storage = $closure();
19+
a::$storage->current();
20+
21+
echo "ok\n";
22+
?>
23+
--EXPECT--
24+
ok

Zend/zend_objects_API.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,9 @@ ZEND_API void ZEND_FASTCALL zend_objects_store_free_object_storage(zend_objects_
100100
if (IS_OBJ_VALID(obj)) {
101101
if (!(OBJ_FLAGS(obj) & IS_OBJ_FREE_CALLED)) {
102102
GC_ADD_FLAGS(obj, IS_OBJ_FREE_CALLED);
103-
if (obj->handlers->free_obj != zend_object_std_dtor) {
103+
if (obj->handlers->free_obj != zend_object_std_dtor
104+
|| (OBJ_FLAGS(obj) & IS_OBJ_WEAKLY_REFERENCED)
105+
) {
104106
GC_ADDREF(obj);
105107
obj->handlers->free_obj(obj);
106108
}

0 commit comments

Comments
 (0)