File tree Expand file tree Collapse file tree 3 files changed +25
-2
lines changed Expand file tree Collapse file tree 3 files changed +25
-2
lines changed Original file line number Diff line number Diff line change 5
5
- Core:
6
6
. Fixed bug #70912 (Null ptr dereference instantiating class with invalid
7
7
array property). (Laruence)
8
+ . Fixed bug #70910 (extract() breaks variable references). (Laruence)
8
9
. Fixed bug #70898, #70895 (null ptr deref and segfault with crafted callable).
9
10
(Anatol, Laruence)
10
11
Original file line number Diff line number Diff line change @@ -1895,8 +1895,8 @@ PHP_FUNCTION(extract)
1895
1895
}
1896
1896
1897
1897
if (Z_TYPE (final_name ) == IS_STRING && php_valid_var_name (Z_STRVAL (final_name ), Z_STRLEN (final_name ))) {
1898
+ zval * orig_var ;
1898
1899
if (extract_refs ) {
1899
- zval * orig_var ;
1900
1900
1901
1901
ZVAL_MAKE_REF (entry );
1902
1902
Z_ADDREF_P (entry );
@@ -1913,7 +1913,16 @@ PHP_FUNCTION(extract)
1913
1913
} else {
1914
1914
ZVAL_DEREF (entry );
1915
1915
if (Z_REFCOUNTED_P (entry )) Z_ADDREF_P (entry );
1916
- zend_hash_update_ind (symbol_table , Z_STR (final_name ), entry );
1916
+ if ((orig_var = zend_hash_find (symbol_table , Z_STR (final_name ))) != NULL ) {
1917
+ if (Z_TYPE_P (orig_var ) == IS_INDIRECT ) {
1918
+ orig_var = Z_INDIRECT_P (orig_var );
1919
+ }
1920
+ ZVAL_DEREF (orig_var );
1921
+ zval_ptr_dtor (orig_var );
1922
+ ZVAL_COPY_VALUE (orig_var , entry );
1923
+ } else {
1924
+ zend_hash_update (symbol_table , Z_STR (final_name ), entry );
1925
+ }
1917
1926
}
1918
1927
count ++ ;
1919
1928
}
Original file line number Diff line number Diff line change
1
+ --TEST--
2
+ Bug #70910 (extract() breaks variable references)
3
+ --FILE--
4
+ <?php
5
+ $ var = 'original value ' ;
6
+ $ ref =& $ var ;
7
+
8
+ $ hash = ['var ' => 'new value ' ];
9
+
10
+ extract ($ hash );
11
+ var_dump ($ var === $ ref );
12
+ --EXPECT --
13
+ bool (true )
You can’t perform that action at this time.
0 commit comments