From 6c8ce9805b8a3f9e7bfb0ed519ab695e06968408 Mon Sep 17 00:00:00 2001 From: Antony Dovgal Date: Wed, 6 Dec 2006 17:42:47 +0000 Subject: [PATCH] fix import_request_variables() --- ext/standard/array.c | 41 +++++++++++++++++++++------------- ext/standard/basic_functions.c | 6 ++--- ext/standard/basic_functions.h | 2 +- 3 files changed, 29 insertions(+), 20 deletions(-) diff --git a/ext/standard/array.c b/ext/standard/array.c index 95ecc332f8..a328fc5f72 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -1280,16 +1280,21 @@ static int php_valid_var_name(zstr var_name, int var_name_len, int var_name_type } PHPAPI int php_prefix_varname(zval *result, zval *prefix, zstr var_name, - int var_name_len, int var_name_type TSRMLS_DC) + int var_name_len, int var_name_type, zend_bool add_underscore TSRMLS_DC) { - Z_UNILEN_P(result) = Z_UNILEN_P(prefix) + 1 + var_name_len; + Z_UNILEN_P(result) = Z_UNILEN_P(prefix) + (add_underscore ? 1 : 0) + var_name_len; + if (UG(unicode)) { Z_TYPE_P(result) = IS_UNICODE; Z_USTRVAL_P(result) = eumalloc(Z_USTRLEN_P(result)+1); u_memcpy(Z_USTRVAL_P(result), Z_USTRVAL_P(prefix), Z_USTRLEN_P(prefix)); - Z_USTRVAL_P(result)[Z_USTRLEN_P(prefix)] = (UChar) 0x5f /*'_'*/; + + if (add_underscore) { + Z_USTRVAL_P(result)[Z_USTRLEN_P(prefix)] = (UChar) 0x5f /*'_'*/; + } + if (var_name_type == IS_UNICODE) { - u_memcpy(Z_USTRVAL_P(result)+Z_USTRLEN_P(prefix)+1, var_name.u, var_name_len+1); + u_memcpy(Z_USTRVAL_P(result)+Z_USTRLEN_P(prefix) + (add_underscore ? 1 : 0), var_name.u, var_name_len+1); } else { UChar *buf; int buf_len; @@ -1304,19 +1309,23 @@ PHPAPI int php_prefix_varname(zval *result, zval *prefix, zstr var_name, return FAILURE; } if (buf_len > var_name_len) { - Z_USTRLEN_P(result) = Z_USTRLEN_P(prefix) + 1 + buf_len; - Z_USTRVAL_P(result) = eurealloc(Z_USTRVAL_P(result), Z_USTRLEN_P(result)+1); + Z_USTRLEN_P(result) = Z_USTRLEN_P(prefix) + (add_underscore ? 1 : 0) + buf_len; + Z_USTRVAL_P(result) = eurealloc(Z_USTRVAL_P(result), Z_USTRLEN_P(result) + 1); } - u_memcpy(Z_USTRVAL_P(result)+Z_USTRLEN_P(prefix)+1, buf, buf_len+1); + u_memcpy(Z_USTRVAL_P(result)+Z_USTRLEN_P(prefix) + (add_underscore ? 1 : 0), buf, buf_len+1); efree(buf); } } else { Z_TYPE_P(result) = IS_STRING; Z_STRVAL_P(result) = emalloc(Z_STRLEN_P(result)+1); memcpy(Z_STRVAL_P(result), Z_STRVAL_P(prefix), Z_STRLEN_P(prefix)); - Z_STRVAL_P(result)[Z_STRLEN_P(prefix)] = '_'; + + if (add_underscore) { + Z_STRVAL_P(result)[Z_STRLEN_P(prefix)] = '_'; + } + if (var_name_type == IS_STRING) { - memcpy(Z_STRVAL_P(result)+Z_STRLEN_P(prefix)+1, var_name.s, var_name_len+1); + memcpy(Z_STRVAL_P(result)+Z_STRLEN_P(prefix) + (add_underscore ? 1 : 0), var_name.s, var_name_len+1); } else { char *buf; int buf_len; @@ -1331,10 +1340,10 @@ PHPAPI int php_prefix_varname(zval *result, zval *prefix, zstr var_name, return FAILURE; } if (buf_len > var_name_len) { - Z_STRLEN_P(result) = Z_STRLEN_P(prefix) + 1 + buf_len; - Z_STRVAL_P(result) = erealloc(Z_STRVAL_P(result), Z_STRLEN_P(result)+1); + Z_STRLEN_P(result) = Z_STRLEN_P(prefix) + (add_underscore ? 1 : 0) + buf_len; + Z_STRVAL_P(result) = erealloc(Z_STRVAL_P(result), Z_STRLEN_P(result) + 1); } - memcpy(Z_STRVAL_P(result)+Z_STRLEN_P(prefix)+1, buf, buf_len+1); + memcpy(Z_STRVAL_P(result)+Z_STRLEN_P(prefix) + (add_underscore ? 1 : 0), buf, buf_len+1); efree(buf); } } @@ -1408,7 +1417,7 @@ PHP_FUNCTION(extract) ZVAL_LONG(&num, num_key); convert_to_text(&num); - php_prefix_varname(&final_name, prefix, Z_UNIVAL(num), Z_UNILEN(num), Z_TYPE(num) TSRMLS_CC); + php_prefix_varname(&final_name, prefix, Z_UNIVAL(num), Z_UNILEN(num), Z_TYPE(num), 1 TSRMLS_CC); zval_dtor(&num); } else { zend_hash_move_forward_ex(Z_ARRVAL_P(var_array), &pos); @@ -1432,7 +1441,7 @@ PHP_FUNCTION(extract) case EXTR_PREFIX_IF_EXISTS: if (var_exists) { - php_prefix_varname(&final_name, prefix, var_name, var_name_len, key_type TSRMLS_CC); + php_prefix_varname(&final_name, prefix, var_name, var_name_len, key_type, 1 TSRMLS_CC); } break; @@ -1444,14 +1453,14 @@ PHP_FUNCTION(extract) case EXTR_PREFIX_ALL: if (Z_TYPE(final_name) == IS_NULL && var_name_len != 0) { - php_prefix_varname(&final_name, prefix, var_name, var_name_len, key_type TSRMLS_CC); + php_prefix_varname(&final_name, prefix, var_name, var_name_len, key_type, 1 TSRMLS_CC); } break; case EXTR_PREFIX_INVALID: if (Z_TYPE(final_name) == IS_NULL) { if (!php_valid_var_name(var_name, var_name_len, key_type)) { - php_prefix_varname(&final_name, prefix, var_name, var_name_len, key_type TSRMLS_CC); + php_prefix_varname(&final_name, prefix, var_name, var_name_len, key_type, 1 TSRMLS_CC); } else { ZVAL_ZSTRL(&final_name, var_name, var_name_len, key_type, 1); } diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 4924f42d7c..75abd04539 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -6252,17 +6252,17 @@ static int copy_request_variable(void *pDest, int num_args, va_list args, zend_h } if (hash_key->nKeyLength) { - php_prefix_varname(&new_key, prefix, hash_key->arKey, hash_key->nKeyLength, hash_key->type TSRMLS_CC); + php_prefix_varname(&new_key, prefix, hash_key->arKey, hash_key->nKeyLength-1, hash_key->type, 0 TSRMLS_CC); } else { zval num; ZVAL_LONG(&num, hash_key->h); convert_to_text(&num); - php_prefix_varname(&new_key, prefix, Z_UNIVAL(num), Z_UNILEN(num), Z_TYPE(num) TSRMLS_CC); + php_prefix_varname(&new_key, prefix, Z_UNIVAL(num), Z_UNILEN(num), Z_TYPE(num), 0 TSRMLS_CC); zval_dtor(&num); } zend_u_delete_global_variable(Z_TYPE(new_key), Z_UNIVAL(new_key), Z_UNILEN(new_key) TSRMLS_CC); - ZEND_U_SET_SYMBOL_WITH_LENGTH(&EG(symbol_table), Z_TYPE(new_key), Z_UNIVAL(new_key), Z_UNILEN(new_key), *var, (*var)->refcount+1, 0); + ZEND_U_SET_SYMBOL_WITH_LENGTH(&EG(symbol_table), Z_TYPE(new_key), Z_UNIVAL(new_key), Z_UNILEN(new_key) + 1, *var, (*var)->refcount+1, 0); zval_dtor(&new_key); return 0; diff --git a/ext/standard/basic_functions.h b/ext/standard/basic_functions.h index 9f9a8638b5..13fc4e404a 100644 --- a/ext/standard/basic_functions.h +++ b/ext/standard/basic_functions.h @@ -139,7 +139,7 @@ PHP_RSHUTDOWN_FUNCTION(user_filters); PHPAPI int _php_error_log(int opt_err, char *message, char *opt, char *headers TSRMLS_DC); PHPAPI char *php_get_current_user(); -PHPAPI int php_prefix_varname(zval *result, zval *prefix, zstr var_name, int var_name_len, int var_name_type TSRMLS_DC); +PHPAPI int php_prefix_varname(zval *result, zval *prefix, zstr var_name, int var_name_len, int var_name_type, zend_bool add_underscore TSRMLS_DC); #if SIZEOF_INT == 4 /* Most 32-bit and 64-bit systems have 32-bit ints */ -- 2.40.0