Skip to content

Commit 12c987f

Browse files
committed
Fix use-after-free in SplObjectStorage::setInfo()
Fixes phpGH-16479 Closes phpGH-16482
1 parent 5ef3fe2 commit 12c987f

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
@@ -70,6 +70,7 @@ PHP NEWS
7070
. Fixed bug GH-16337 (Use-after-free in SplHeap). (nielsdos)
7171
. Fixed bug GH-16464 (Use-after-free in SplDoublyLinkedList::offsetSet()).
7272
(ilutov)
73+
. Fixed bug GH-16479 (Use-after-free in SplObjectStorage::setInfo()). (ilutov)
7374

7475
- Standard:
7576
. 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
@@ -746,8 +746,10 @@ PHP_METHOD(SplObjectStorage, setInfo)
746746
if ((element = zend_hash_get_current_data_ptr_ex(&intern->storage, &intern->pos)) == NULL) {
747747
RETURN_NULL();
748748
}
749-
zval_ptr_dtor(&element->inf);
749+
zval garbage;
750+
ZVAL_COPY_VALUE(&garbage, &element->inf);
750751
ZVAL_COPY(&element->inf, inf);
752+
zval_ptr_dtor(&garbage);
751753
} /* }}} */
752754

753755
/* {{{ 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)