File tree Expand file tree Collapse file tree 4 files changed +31
-0
lines changed Expand file tree Collapse file tree 4 files changed +31
-0
lines changed Original file line number Diff line number Diff line change @@ -47,6 +47,7 @@ PHP                                                                        NEWS
4747  . Reset global pointers to prevent use-after-free in zend_jit_status().
4848    (Florian Engelhardt)
4949  . Fix issue with JIT restart and hooks. (nielsdos)
50+   . Fix crash with dynamic function defs in hooks during preload. (nielsdos)
5051
5152- OpenSSL:
5253  . Fixed bug GH-18986 (OpenSSL backend: incorrect RAND_{load,write}_file()
Original file line number Diff line number Diff line change @@ -4132,6 +4132,24 @@ static void preload_link(void)
41324132				preload_remove_declares (op_array );
41334133			}
41344134		} ZEND_HASH_FOREACH_END ();
4135+ 
4136+ 		if  (ce -> num_hooked_props  >  0 ) {
4137+ 			zend_property_info  * info ;
4138+ 
4139+ 			ZEND_HASH_MAP_FOREACH_PTR (& ce -> properties_info , info ) {
4140+ 				if  (info -> hooks ) {
4141+ 					for  (uint32_t  i  =  0 ; i  <  ZEND_PROPERTY_HOOK_COUNT ; i ++ ) {
4142+ 						if  (info -> hooks [i ]) {
4143+ 							op_array  =  & info -> hooks [i ]-> op_array ;
4144+ 							ZEND_ASSERT (op_array -> type  ==  ZEND_USER_FUNCTION );
4145+ 							if  (!(op_array -> fn_flags  &  ZEND_ACC_TRAIT_CLONE )) {
4146+ 								preload_remove_declares (op_array );
4147+ 							}
4148+ 						}
4149+ 					}
4150+ 				}
4151+ 			} ZEND_HASH_FOREACH_END ();
4152+ 		}
41354153	} ZEND_HASH_FOREACH_END ();
41364154}
41374155
Original file line number Diff line number Diff line change @@ -5,6 +5,15 @@ class Test {
55            echo  "dynamic \n" ;
66        }
77    }      
8+ 
9+     public  int  $ hook
10+         get {
11+             function  dynamic_in_hook () {
12+                 echo  "dynamic in hook \n" ;
13+             }
14+             return  1 ;
15+         }
16+     }
817}       
918
1019function  func () {
@@ -16,3 +25,4 @@ function func() {
1625$ testnew  Test ; 
1726$ testmethod ();
1827func ();
28+ $ testhook ;
Original file line number Diff line number Diff line change @@ -15,7 +15,9 @@ if (PHP_OS_FAMILY == 'Windows') die('skip Preloading is not supported on Windows
1515<?php 
1616dynamic ();
1717dynamic2 ();
18+ dynamic_in_hook ();
1819?> 
1920--EXPECT--
2021dynamic
2122dynamic2
23+ dynamic in hook
 
 
   
 
     
   
   
          
    
    
     
    
      
     
     
    You can’t perform that action at this time.
  
 
    
  
    
      
        
     
       
      
     
   
 
    
    
  
 
  
 
     
    
0 commit comments