@@ -54,6 +54,39 @@ static zend_always_inline void php_register_variable_quick(const char *name, siz
54
54
zend_string_release_ex (key , 0 );
55
55
}
56
56
57
+ PHPAPI void php_register_known_variable (const char * var_name , size_t var_name_len , zval * value , zval * track_vars_array )
58
+ {
59
+ HashTable * symbol_table = NULL ;
60
+
61
+ ZEND_ASSERT (var_name != NULL );
62
+ ZEND_ASSERT (var_name_len != 0 );
63
+ ZEND_ASSERT (track_vars_array != NULL && Z_TYPE_P (track_vars_array ) == IS_ARRAY );
64
+
65
+ symbol_table = Z_ARRVAL_P (track_vars_array );
66
+
67
+ #if ZEND_DEBUG
68
+ /* Verify the name is valid for a PHP variable */
69
+ ZEND_ASSERT (!(var_name_len == strlen ("GLOBALS" ) && !memcmp (var_name , "GLOBALS" , strlen ("GLOBALS" ))));
70
+ ZEND_ASSERT (!(var_name_len == strlen ("this" ) && !memcmp (var_name , "this" , strlen ("this" ))));
71
+
72
+ /* Assert that the variable name is not numeric */
73
+ zend_ulong idx ;
74
+ ZEND_ASSERT (!ZEND_HANDLE_NUMERIC_STR (var_name , var_name_len , idx ));
75
+ /* ensure that we don't have null bytes, spaces, dots, or array bracket in the variable name (not binary safe) */
76
+ const char * p = var_name ;
77
+ for (size_t l = 0 ; l < var_name_len ; l ++ ) {
78
+ ZEND_ASSERT (* p != '\0' && * p != ' ' && * p != '.' && * p != '[' );
79
+ p ++ ;
80
+ }
81
+
82
+ /* Do not allow to register cookies this way */
83
+ ZEND_ASSERT (Z_TYPE (PG (http_globals )[TRACK_VARS_COOKIE ]) == IS_UNDEF ||
84
+ Z_ARRVAL (PG (http_globals )[TRACK_VARS_COOKIE ]) != symbol_table );
85
+ #endif
86
+
87
+ php_register_variable_quick (var_name , var_name_len , value , symbol_table );
88
+ }
89
+
57
90
PHPAPI void php_register_variable_ex (const char * var_name , zval * val , zval * track_vars_array )
58
91
{
59
92
char * p = NULL ;
0 commit comments