cvs: php4 /ext/standard array.c

From: Date: Mon, 08 Jan 2001 21:57:14 +0000
Subject: cvs: php4 /ext/standard array.c
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-3493@lists.php.net to get a copy of this message
andrei Mon Jan 8 13:57:14 2001 EDT Modified files: /php4/ext/standard array.c Log: @- Changed extract() to check that prefixed name is a valid one. (Andrei) Changed extract() to check that prefixed name is a valid one. Optimized extract() a bit too. # It'd be nice if someone made regression tests for extract(). Index: php4/ext/standard/array.c diff -u php4/ext/standard/array.c:1.88 php4/ext/standard/array.c:1.89 --- php4/ext/standard/array.c:1.88 Mon Jan 8 12:57:59 2001 +++ php4/ext/standard/array.c Mon Jan 8 13:57:14 2001 @@ -20,7 +20,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: array.c,v 1.88 2001/01/08 20:57:59 andrei Exp $ */ +/* $Id: array.c,v 1.89 2001/01/08 21:57:14 andrei Exp $ */ #include "php.h" #include "php_ini.h" @@ -1083,8 +1083,7 @@ /* }}} */ -/* {{{ int _valid_var_name(char *varname) */ -static int _valid_var_name(char *varname) +static int php_valid_var_name(char *varname) { int len, i; @@ -1106,7 +1105,6 @@ return 1; } -/* }}} */ /* {{{ proto int extract(array var_array, int extract_type [, string prefix]) @@ -1116,7 +1114,7 @@ zval **var_array, **etype, **prefix; zval **entry, *data; char *varname, *finalname; - ulong lkey; + ulong lkey, varname_len; int res, extype, count = 0; switch(ZEND_NUM_ARGS()) { @@ -1165,47 +1163,48 @@ zend_hash_internal_pointer_reset(Z_ARRVAL_PP(var_array)); while(zend_hash_get_current_data(Z_ARRVAL_PP(var_array), (void **)&entry) == SUCCESS) { - if (zend_hash_get_current_key(Z_ARRVAL_PP(var_array), &varname, &lkey, 0) == HASH_KEY_IS_STRING) { + if (zend_hash_get_current_key_ex(Z_ARRVAL_PP(var_array), &varname, &varname_len, &lkey, 0, NULL) == HASH_KEY_IS_STRING) { - if (_valid_var_name(varname)) { - finalname = NULL; + varname_len--; + finalname = NULL; - res = zend_hash_exists(EG(active_symbol_table), varname, strlen(varname)+1); - switch (extype) { - case EXTR_OVERWRITE: - finalname = estrdup(varname); - break; - - case EXTR_PREFIX_SAME: - if (!res) - finalname = estrdup(varname); - /* break omitted intentionally */ - - case EXTR_PREFIX_ALL: - if (!finalname) { - finalname = emalloc(strlen(varname) + Z_STRLEN_PP(prefix) + 2); - strcpy(finalname, Z_STRVAL_PP(prefix)); - strcat(finalname, "_"); - strcat(finalname, varname); - } - break; - - default: - if (!res) - finalname = estrdup(varname); - break; - } + res = zend_hash_exists(EG(active_symbol_table), varname, varname_len+1); + switch (extype) { + case EXTR_OVERWRITE: + finalname = estrndup(varname, varname_len); + break; + + case EXTR_PREFIX_SAME: + if (!res) + finalname = estrndup(varname, varname_len); + /* break omitted intentionally */ + + case EXTR_PREFIX_ALL: + if (!finalname) { + finalname = emalloc(varname_len + Z_STRLEN_PP(prefix) + 2); + strcpy(finalname, Z_STRVAL_PP(prefix)); + strcat(finalname, "_"); + strcat(finalname, varname); + } + break; + + default: + if (!res) + finalname = estrndup(varname, varname_len); + break; + } - if (finalname) { + if (finalname) { + if (php_valid_var_name(finalname)) { MAKE_STD_ZVAL(data); *data = **entry; zval_copy_ctor(data); ZEND_SET_SYMBOL(EG(active_symbol_table), finalname, data); - efree(finalname); count++; } + efree(finalname); } }

« previous php.cvs (#3493) next »