From: Stefan Esser Date: Fri, 3 Dec 2004 16:04:26 +0000 (+0000) Subject: MFH X-Git-Tag: php-4.3.10RC2~15 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0520c88818a17bd4640fa95718307576d41f79da;p=php MFH --- diff --git a/ext/standard/var_unserializer.c b/ext/standard/var_unserializer.c index 3a24111baa..40d9fc953e 100644 --- a/ext/standard/var_unserializer.c +++ b/ext/standard/var_unserializer.c @@ -205,9 +205,15 @@ static inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTable *ht, int switch (Z_TYPE_P(key)) { case IS_LONG: + if (zend_hash_index_find(ht, Z_LVAL_P(key), (void **)&old_data)) { + var_replace(var_hash, old_data, rval); + } zend_hash_index_update(ht, Z_LVAL_P(key), &data, sizeof(data), NULL); break; case IS_STRING: + if (zend_hash_find(ht, Z_STRVAL_P(key), Z_STRLEN_P(key) + 1, (void **)&old_data)) { + var_replace(var_hash, old_data, rval); + } zend_hash_update(ht, Z_STRVAL_P(key), Z_STRLEN_P(key) + 1, &data, sizeof(data), NULL); break; } @@ -882,6 +888,8 @@ yy86: return 0; } + if (*rval == *rval_ref) return 0; + if (*rval != NULL) { zval_ptr_dtor(rval); } diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re index 1cf6ef5b5c..f04b06dcd1 100644 --- a/ext/standard/var_unserializer.re +++ b/ext/standard/var_unserializer.re @@ -208,9 +208,15 @@ static inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTable *ht, int switch (Z_TYPE_P(key)) { case IS_LONG: + if (zend_hash_index_find(ht, Z_LVAL_P(key), (void **)&old_data)) { + var_replace(var_hash, old_data, rval); + } zend_hash_index_update(ht, Z_LVAL_P(key), &data, sizeof(data), NULL); break; case IS_STRING: + if (zend_hash_find(ht, Z_STRVAL_P(key), Z_STRLEN_P(key) + 1, (void **)&old_data)) { + var_replace(var_hash, old_data, rval); + } zend_hash_update(ht, Z_STRVAL_P(key), Z_STRLEN_P(key) + 1, &data, sizeof(data), NULL); break; } @@ -332,6 +338,8 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER) if (id == -1 || var_access(var_hash, id, &rval_ref) != SUCCESS) { return 0; } + + if (*rval == *rval_ref) return 0; if (*rval != NULL) { zval_ptr_dtor(rval);