File tree Expand file tree Collapse file tree 2 files changed +31
-1
lines changed Expand file tree Collapse file tree 2 files changed +31
-1
lines changed Original file line number Diff line number Diff line change @@ -41,10 +41,13 @@ PHPAPI zend_class_entry *spl_ce_SplStack;
4141 efree(elem); \
4242}
4343
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)) { \
4545 efree(elem); \
46+ on_free \
4647}
4748
49+ #define SPL_LLIST_CHECK_DELREF (elem ) SPL_LLIST_CHECK_DELREF_EX(elem, ;)
50+
4851#define SPL_LLIST_ADDREF (elem ) SPL_LLIST_RC(elem)++
4952#define SPL_LLIST_CHECK_ADDREF (elem ) if (elem) SPL_LLIST_RC(elem)++
5053
@@ -1013,8 +1016,12 @@ PHP_METHOD(SplDoublyLinkedList, serialize)
10131016 smart_str_appendc (& buf , ':' );
10141017 next = current -> next ;
10151018
1019+ SPL_LLIST_CHECK_ADDREF (next );
1020+
10161021 php_var_serialize (& buf , & current -> data , & var_hash );
10171022
1023+ SPL_LLIST_CHECK_DELREF_EX (next , break ;);
1024+
10181025 current = next ;
10191026 }
10201027
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