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 @@ -76,6 +76,7 @@ PHP NEWS
76
76
. Fixed bug GH-16337 (Use-after-free in SplHeap). (nielsdos)
77
77
. Fixed bug GH-16464 (Use-after-free in SplDoublyLinkedList::offsetSet()).
78
78
(ilutov)
79
+ . Fixed bug GH-16479 (Use-after-free in SplObjectStorage::setInfo()). (ilutov)
79
80
80
81
- Standard:
81
82
. Fixed bug GH-16293 (Failed assertion when throwing in assert() callback with
Original file line number Diff line number Diff line change @@ -744,8 +744,10 @@ PHP_METHOD(SplObjectStorage, setInfo)
744
744
if ((element = zend_hash_get_current_data_ptr_ex (& intern -> storage , & intern -> pos )) == NULL ) {
745
745
RETURN_NULL ();
746
746
}
747
- zval_ptr_dtor (& element -> inf );
747
+ zval garbage ;
748
+ ZVAL_COPY_VALUE (& garbage , & element -> inf );
748
749
ZVAL_COPY (& element -> inf , inf );
750
+ zval_ptr_dtor (& garbage );
749
751
} /* }}} */
750
752
751
753
/* {{{ 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