summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2014-03-06 16:53:13 +0400
committerDmitry Stogov <dmitry@zend.com>2014-03-06 16:53:13 +0400
commit3e4c22b4998295b05eebb1ee080585b71b64be75 (patch)
tree987a2d8e2bfd797fc3fdfb401986987afb3ff6f1
parentdfe1fd73bf127de368a3098b3e5b251e7d7397b4 (diff)
downloadphp-git-3e4c22b4998295b05eebb1ee080585b71b64be75.tar.gz
Fixed possible HashTable modification in its destructor
-rw-r--r--Zend/zend_hash.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c
index 0f424cb8eb..b189599b32 100644
--- a/Zend/zend_hash.c
+++ b/Zend/zend_hash.c
@@ -508,13 +508,17 @@ static zend_always_inline void _zend_hash_del_el_ex(HashTable *ht, uint idx, Buc
}
}
}
- if (ht->pDestructor) {
- ht->pDestructor(&p->val);
- }
if (p->key) {
STR_RELEASE(p->key);
}
- Z_TYPE(p->val) = IS_UNDEF;
+ if (ht->pDestructor) {
+ zval tmp;
+ ZVAL_COPY_VALUE(&tmp, &p->val);
+ ZVAL_UNDEF(&p->val);
+ ht->pDestructor(&tmp);
+ } else {
+ ZVAL_UNDEF(&p->val);
+ }
}
static zend_always_inline void _zend_hash_del_el(HashTable *ht, uint idx, Bucket *p)