File tree 3 files changed +32
-1
lines changed 3 files changed +32
-1
lines changed Original file line number Diff line number Diff line change @@ -18,6 +18,7 @@ PHP NEWS
18
18
. Fixed bug GH-16588 (UAF in Observer->serialize). (nielsdos)
19
19
. Fix GH-16477 (Segmentation fault when calling __debugInfo() after failed
20
20
SplFileObject::__constructor). (Girgias)
21
+ . Fixed bug GH-16589 (UAF in SplDoublyLinked->serialize()). (nielsdos)
21
22
22
23
- SysVShm:
23
24
. Fixed bug GH-16591 (Assertion error in shm_put_var). (nielsdos, cmb)
Original file line number Diff line number Diff line change @@ -41,10 +41,13 @@ PHPAPI zend_class_entry *spl_ce_SplStack;
41
41
efree(elem); \
42
42
}
43
43
44
- #define SPL_LLIST_CHECK_DELREF (elem ) if ((elem) && !--SPL_LLIST_RC(elem)) { \
44
+ #define SPL_LLIST_CHECK_DELREF_EX (elem , on_free ) if ((elem) && !--SPL_LLIST_RC(elem)) { \
45
45
efree(elem); \
46
+ on_free \
46
47
}
47
48
49
+ #define SPL_LLIST_CHECK_DELREF (elem ) SPL_LLIST_CHECK_DELREF_EX(elem, ;)
50
+
48
51
#define SPL_LLIST_ADDREF (elem ) SPL_LLIST_RC(elem)++
49
52
#define SPL_LLIST_CHECK_ADDREF (elem ) if (elem) SPL_LLIST_RC(elem)++
50
53
@@ -1013,8 +1016,12 @@ PHP_METHOD(SplDoublyLinkedList, serialize)
1013
1016
smart_str_appendc (& buf , ':' );
1014
1017
next = current -> next ;
1015
1018
1019
+ SPL_LLIST_CHECK_ADDREF (next );
1020
+
1016
1021
php_var_serialize (& buf , & current -> data , & var_hash );
1017
1022
1023
+ SPL_LLIST_CHECK_DELREF_EX (next , break ;);
1024
+
1018
1025
current = next ;
1019
1026
}
1020
1027
Original file line number Diff line number Diff line change
1
+ --TEST--
2
+ GH-16589 (UAF in SplDoublyLinked->serialize())
3
+ --CREDITS--
4
+ chibinz
5
+ --FILE--
6
+ <?php
7
+
8
+ class C {
9
+ function __serialize (): array {
10
+ global $ list ;
11
+ $ list ->pop ();
12
+ return [];
13
+ }
14
+ }
15
+
16
+ $ list = new SplDoublyLinkedList ;
17
+ $ list ->add (0 , new C );
18
+ $ list ->add (1 , 1 );
19
+ var_dump ($ list ->serialize ());
20
+
21
+ ?>
22
+ --EXPECT--
23
+ string(17) "i:0;:O:1:"C":0:{}"
You can’t perform that action at this time.
0 commit comments