From: Xinchen Hui Date: Sat, 7 Mar 2015 16:15:55 +0000 (+0800) Subject: Fixed zend_hash_append result duplicated key X-Git-Tag: PRE_PHP7_NSAPI_REMOVAL~775 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=95b4aa529336ede207dbd2d114521c60ec4f2ccb;p=php Fixed zend_hash_append result duplicated key actually, maybe we should precalculate before calling zend_hash_appen when we are not sure whether the hash is caclculated(prop_info->name). but it looks a little ugly.. (also for zend_string_copy) --- diff --git a/Zend/zend.h b/Zend/zend.h index 4cf73225b7..94cab74af1 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -31,9 +31,9 @@ #include "zend_types.h" #include "zend_errors.h" #include "zend_alloc.h" -#include "zend_hash.h" #include "zend_llist.h" #include "zend_string.h" +#include "zend_hash.h" #include "zend_ast.h" #include "zend_gc.h" #include "zend_variables.h" diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 6dda9effa0..7cee3ba73d 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -1473,7 +1473,6 @@ ZEND_API zend_array *zend_rebuild_symbol_table(void) /* {{{ */ /*printf("Cache miss! Initialized %x\n", EG(active_symbol_table));*/ } for (i = 0; i < ex->func->op_array.last_var; i++) { - zend_string_addref(ex->func->op_array.vars[i]); _zend_hash_append_ind(symbol_table, ex->func->op_array.vars[i], ZEND_CALL_VAR_NUM(ex, i)); } diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h index 1e166ac8c3..02991a643b 100644 --- a/Zend/zend_hash.h +++ b/Zend/zend_hash.h @@ -818,8 +818,8 @@ static zend_always_inline void _zend_hash_append(HashTable *ht, zend_string *key Bucket *p = ht->arData + idx; ZVAL_COPY_VALUE(&p->val, zv); - p->key = key; - p->h = key->h; + p->key = zend_string_copy(key); + p->h = zend_string_hash_val(key); nIndex = p->h & ht->nTableMask; Z_NEXT(p->val) = ht->arHash[nIndex]; ht->arHash[nIndex] = idx; @@ -834,8 +834,8 @@ static zend_always_inline void _zend_hash_append_ptr(HashTable *ht, zend_string Bucket *p = ht->arData + idx; ZVAL_PTR(&p->val, ptr); - p->key = key; - p->h = key->h; + p->key = zend_string_copy(key); + p->h = zend_string_hash_val(key); nIndex = p->h & ht->nTableMask; Z_NEXT(p->val) = ht->arHash[nIndex]; ht->arHash[nIndex] = idx; @@ -850,8 +850,8 @@ static zend_always_inline void _zend_hash_append_ind(HashTable *ht, zend_string Bucket *p = ht->arData + idx; ZVAL_INDIRECT(&p->val, ptr); - p->key = key; - p->h = key->h; + p->key = zend_string_copy(key); + p->h = zend_string_hash_val(key); nIndex = p->h & ht->nTableMask; Z_NEXT(p->val) = ht->arHash[nIndex]; ht->arHash[nIndex] = idx; diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index c48718c46c..e3ef17cc90 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -636,7 +636,6 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke child_info = parent_info; } } - zend_string_addref(key); _zend_hash_append_ptr(&ce->properties_info, key, child_info); } } @@ -704,7 +703,6 @@ static void do_inherit_class_constant(zend_string *name, zval *zv, zend_class_en ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; } Z_ADDREF_P(zv); - zend_string_addref(name); _zend_hash_append(&ce->constants_table, name, zv); } } @@ -857,7 +855,6 @@ ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent zend_function *new_func = do_inherit_method(key, func, ce); if (new_func) { - zend_string_addref(key); _zend_hash_append_ptr(&ce->function_table, key, new_func); } } ZEND_HASH_FOREACH_END(); diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index af604e2675..a5c0bf0a03 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -84,7 +84,6 @@ ZEND_API void rebuild_object_properties(zend_object *zobj) /* {{{ */ (prop_info->flags & ZEND_ACC_STATIC) == 0 && Z_TYPE_P(OBJ_PROP(zobj, prop_info->offset)) != IS_UNDEF) { - zend_string_addref(prop_info->name); _zend_hash_append_ind(zobj->properties, prop_info->name, OBJ_PROP(zobj, prop_info->offset)); }