File tree 3 files changed +29
-1
lines changed
3 files changed +29
-1
lines changed Original file line number Diff line number Diff line change @@ -84,6 +84,7 @@ PHP NEWS
84
84
. Fixed bug GH-16337 (Use-after-free in SplHeap). (nielsdos)
85
85
. Fixed bug GH-16464 (Use-after-free in SplDoublyLinkedList::offsetSet()).
86
86
(ilutov)
87
+ . Fixed bug GH-16479 (Use-after-free in SplObjectStorage::setInfo()). (ilutov)
87
88
88
89
- Standard:
89
90
. Fixed bug GH-16293 (Failed assertion when throwing in assert() callback with
Original file line number Diff line number Diff line change @@ -739,8 +739,10 @@ PHP_METHOD(SplObjectStorage, setInfo)
739
739
if ((element = zend_hash_get_current_data_ptr_ex (& intern -> storage , & intern -> pos )) == NULL ) {
740
740
RETURN_NULL ();
741
741
}
742
- zval_ptr_dtor (& element -> inf );
742
+ zval garbage ;
743
+ ZVAL_COPY_VALUE (& garbage , & element -> inf );
743
744
ZVAL_COPY (& element -> inf , inf );
745
+ zval_ptr_dtor (& garbage );
744
746
} /* }}} */
745
747
746
748
/* {{{ Moves position forward */
Original file line number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments