summaryrefslogtreecommitdiff
path: root/ext/standard/array.c
diff options
context:
space:
mode:
authorAndrei Zmievski <andrei@php.net>2001-01-08 21:57:14 +0000
committerAndrei Zmievski <andrei@php.net>2001-01-08 21:57:14 +0000
commit145f60a485b0b1333b7b21bf60092a1642a41cff (patch)
tree5ac239a4c6948c2c319aaba172d4773929122f32 /ext/standard/array.c
parentaff9ff83562164a33289610260c081767ae971ae (diff)
downloadphp-git-145f60a485b0b1333b7b21bf60092a1642a41cff.tar.gz
@- 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().
Diffstat (limited to 'ext/standard/array.c')
-rw-r--r--ext/standard/array.c71
1 files changed, 35 insertions, 36 deletions
diff --git a/ext/standard/array.c b/ext/standard/array.c
index c4c115eb32..813d7893e1 100644
--- a/ext/standard/array.c
+++ b/ext/standard/array.c
@@ -1083,8 +1083,7 @@ PHP_FUNCTION(in_array)
/* }}} */
-/* {{{ 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 @@ static int _valid_var_name(char *varname)
return 1;
}
-/* }}} */
/* {{{ proto int extract(array var_array, int extract_type [, string prefix])
@@ -1116,7 +1114,7 @@ PHP_FUNCTION(extract)
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 @@ PHP_FUNCTION(extract)
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 (_valid_var_name(varname)) {
- 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;
- }
+ if (zend_hash_get_current_key_ex(Z_ARRVAL_PP(var_array), &varname, &varname_len, &lkey, 0, NULL) == HASH_KEY_IS_STRING) {
+
+ varname_len--;
+ finalname = NULL;
+
+ 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);
}
}