cvs: php4 /ext/standard array.c
| From: | Andrei Zmievski | 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);
}
}