Skip to content

Commit 6d6b20f

Browse files
committed
Merge branch 'PHP-8.3' into PHP-8.4
* PHP-8.3: Fix use-after-free in SplObjectStorage::setInfo()
2 parents c98c198 + 40e43ff commit 6d6b20f

File tree

3 files changed

+29
-1
lines changed

3 files changed

+29
-1
lines changed

NEWS

+1
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ PHP NEWS
8484
. Fixed bug GH-16337 (Use-after-free in SplHeap). (nielsdos)
8585
. Fixed bug GH-16464 (Use-after-free in SplDoublyLinkedList::offsetSet()).
8686
(ilutov)
87+
. Fixed bug GH-16479 (Use-after-free in SplObjectStorage::setInfo()). (ilutov)
8788

8889
- Standard:
8990
. Fixed bug GH-16293 (Failed assertion when throwing in assert() callback with

ext/spl/spl_observer.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -739,8 +739,10 @@ PHP_METHOD(SplObjectStorage, setInfo)
739739
if ((element = zend_hash_get_current_data_ptr_ex(&intern->storage, &intern->pos)) == NULL) {
740740
RETURN_NULL();
741741
}
742-
zval_ptr_dtor(&element->inf);
742+
zval garbage;
743+
ZVAL_COPY_VALUE(&garbage, &element->inf);
743744
ZVAL_COPY(&element->inf, inf);
745+
zval_ptr_dtor(&garbage);
744746
} /* }}} */
745747

746748
/* {{{ Moves position forward */

ext/spl/tests/gh16479.phpt

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
--TEST--
2+
GH-16479: Use-after-free in SplObjectStorage::setInfo()
3+
--FILE--
4+
<?php
5+
6+
class C {
7+
function __destruct() {
8+
global $store;
9+
$store->removeAll($store);
10+
}
11+
}
12+
13+
$o = new stdClass;
14+
$store = new SplObjectStorage;
15+
$store[$o] = new C;
16+
$store->setInfo(1);
17+
var_dump($store);
18+
19+
?>
20+
--EXPECT--
21+
object(SplObjectStorage)#2 (1) {
22+
["storage":"SplObjectStorage":private]=>
23+
array(0) {
24+
}
25+
}

0 commit comments

Comments
 (0)