diff options
| author | Stefan Esser <sesser@php.net> | 2004-12-03 16:04:26 +0000 |
|---|---|---|
| committer | Stefan Esser <sesser@php.net> | 2004-12-03 16:04:26 +0000 |
| commit | 0520c88818a17bd4640fa95718307576d41f79da (patch) | |
| tree | 151dbf30c41470ef70595aa66657fa67d8fd86ee | |
| parent | bc0b61d250301d84c6388a058f962045a7744e9d (diff) | |
| download | php-git-0520c88818a17bd4640fa95718307576d41f79da.tar.gz | |
MFH
| -rw-r--r-- | ext/standard/var_unserializer.c | 8 | ||||
| -rw-r--r-- | ext/standard/var_unserializer.re | 8 |
2 files changed, 16 insertions, 0 deletions
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); |
