Add php_register_known_variable() for know var names

This commit is contained in:
George Peter Banyard 2022-05-16 23:39:00 +01:00
parent 1d0c287b90
commit 55908db007
2 changed files with 34 additions and 0 deletions

View file

@ -54,6 +54,39 @@ static zend_always_inline void php_register_variable_quick(const char *name, siz
zend_string_release_ex(key, 0); zend_string_release_ex(key, 0);
} }
PHPAPI void php_register_known_variable(const char *var_name, size_t var_name_len, zval *value, zval *track_vars_array)
{
HashTable *symbol_table = NULL;
ZEND_ASSERT(var_name != NULL);
ZEND_ASSERT(var_name_len != 0);
ZEND_ASSERT(track_vars_array != NULL && Z_TYPE_P(track_vars_array) == IS_ARRAY);
symbol_table = Z_ARRVAL_P(track_vars_array);
#if ZEND_DEBUG
/* Verify the name is valid for a PHP variable */
ZEND_ASSERT(!(var_name_len == strlen("GLOBALS") && !memcmp(var_name, "GLOBALS", strlen("GLOBALS"))));
ZEND_ASSERT(!(var_name_len == strlen("this") && !memcmp(var_name, "this", strlen("this"))));
/* Assert that the variable name is not numeric */
zend_ulong idx;
ZEND_ASSERT(!ZEND_HANDLE_NUMERIC_STR(var_name, var_name_len, idx));
/* ensure that we don't have null bytes, spaces, dots, or array bracket in the variable name (not binary safe) */
const char *p = var_name;
for (size_t l = 0; l < var_name_len; l++) {
ZEND_ASSERT(*p != '\0' && *p != ' ' && *p != '.' && *p != '[');
p++;
}
/* Do not allow to register cookies this way */
ZEND_ASSERT(Z_TYPE(PG(http_globals)[TRACK_VARS_COOKIE]) == IS_UNDEF ||
Z_ARRVAL(PG(http_globals)[TRACK_VARS_COOKIE]) != symbol_table);
#endif
php_register_variable_quick(var_name, var_name_len, value, symbol_table);
}
PHPAPI void php_register_variable_ex(const char *var_name, zval *val, zval *track_vars_array) PHPAPI void php_register_variable_ex(const char *var_name, zval *val, zval *track_vars_array)
{ {
char *p = NULL; char *p = NULL;

View file

@ -36,6 +36,7 @@ PHPAPI void php_register_variable(const char *var, const char *val, zval *track_
/* binary-safe version */ /* binary-safe version */
PHPAPI void php_register_variable_safe(const char *var, const char *val, size_t val_len, zval *track_vars_array); PHPAPI void php_register_variable_safe(const char *var, const char *val, size_t val_len, zval *track_vars_array);
PHPAPI void php_register_variable_ex(const char *var, zval *val, zval *track_vars_array); PHPAPI void php_register_variable_ex(const char *var, zval *val, zval *track_vars_array);
PHPAPI void php_register_known_variable(const char *var, size_t var_len, zval *value, zval *track_vars_array);
PHPAPI void php_build_argv(const char *s, zval *track_vars_array); PHPAPI void php_build_argv(const char *s, zval *track_vars_array);
PHPAPI int php_hash_environment(void); PHPAPI int php_hash_environment(void);