Skip to content

Commit 55908db

Browse files
committed
Add php_register_known_variable() for know var names
1 parent 1d0c287 commit 55908db

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

main/php_variables.c

+33
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,39 @@ static zend_always_inline void php_register_variable_quick(const char *name, siz
5454
zend_string_release_ex(key, 0);
5555
}
5656

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+
5790
PHPAPI void php_register_variable_ex(const char *var_name, zval *val, zval *track_vars_array)
5891
{
5992
char *p = NULL;

main/php_variables.h

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ PHPAPI void php_register_variable(const char *var, const char *val, zval *track_
3636
/* binary-safe version */
3737
PHPAPI void php_register_variable_safe(const char *var, const char *val, size_t val_len, zval *track_vars_array);
3838
PHPAPI void php_register_variable_ex(const char *var, zval *val, zval *track_vars_array);
39+
PHPAPI void php_register_known_variable(const char *var, size_t var_len, zval *value, zval *track_vars_array);
3940

4041
PHPAPI void php_build_argv(const char *s, zval *track_vars_array);
4142
PHPAPI int php_hash_environment(void);

0 commit comments

Comments
 (0)