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