summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Zmievski <andrei@php.net>1999-10-19 14:43:48 +0000
committerAndrei Zmievski <andrei@php.net>1999-10-19 14:43:48 +0000
commitee6c1ea7433c12e131acccfe178644a518fb2f3f (patch)
tree63ffe3e29f1170b8dcfd7fc2e871c533fdac2cf8
parentf3127955badc716695b180d352c9514308f7abec (diff)
downloadphp-git-ee6c1ea7433c12e131acccfe178644a518fb2f3f.tar.gz
(PHP extract): Fixed bug that would mess up global and referenced
variables in certain cases.
-rw-r--r--ext/standard/basic_functions.c16
1 files changed, 6 insertions, 10 deletions
diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c
index 8c400933ff..76d0389e60 100644
--- a/ext/standard/basic_functions.c
+++ b/ext/standard/basic_functions.c
@@ -2237,8 +2237,7 @@ static int _valid_var_name(char *varname)
PHP_FUNCTION(extract)
{
zval **var_array, **etype, **prefix;
- zval **entry_ptr, *entry, *exist;
- zval *data;
+ zval **entry, *exist, *data;
char *varname, *finalname;
ulong lkey;
int res, extype;
@@ -2288,8 +2287,7 @@ PHP_FUNCTION(extract)
}
zend_hash_internal_pointer_reset((*var_array)->value.ht);
- while(zend_hash_get_current_data((*var_array)->value.ht, (void **)&entry_ptr) == SUCCESS) {
- entry = *entry_ptr;
+ while(zend_hash_get_current_data((*var_array)->value.ht, (void **)&entry) == SUCCESS) {
if (zend_hash_get_current_key((*var_array)->value.ht, &varname, &lkey) == HASH_KEY_IS_STRING) {
@@ -2297,7 +2295,7 @@ PHP_FUNCTION(extract)
finalname = NULL;
res = zend_hash_find(EG(active_symbol_table),
- varname, strlen(varname)+1, (void**)&exist);
+ varname, strlen(varname)+1, (void**)&exist);
switch (extype) {
case EXTR_OVERWRITE:
finalname = estrdup(varname);
@@ -2324,13 +2322,11 @@ PHP_FUNCTION(extract)
}
if (finalname) {
- data = (zval *)emalloc(sizeof(zval));
- *data = *entry;
+ MAKE_STD_ZVAL(data);
+ *data = **entry;
zval_copy_ctor(data);
- INIT_PZVAL(data);
- zend_hash_update(EG(active_symbol_table), finalname,
- strlen(finalname)+1, &data, sizeof(zval *), NULL);
+ ZEND_SET_SYMBOL(EG(active_symbol_table), finalname, data);
efree(finalname);
}
}