diff options
author | Dmitry Stogov <dmitry@zend.com> | 2014-03-06 16:53:13 +0400 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2014-03-06 16:53:13 +0400 |
commit | 3e4c22b4998295b05eebb1ee080585b71b64be75 (patch) | |
tree | 987a2d8e2bfd797fc3fdfb401986987afb3ff6f1 | |
parent | dfe1fd73bf127de368a3098b3e5b251e7d7397b4 (diff) | |
download | php-git-3e4c22b4998295b05eebb1ee080585b71b64be75.tar.gz |
Fixed possible HashTable modification in its destructor
-rw-r--r-- | Zend/zend_hash.c | 12 |
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) |