summaryrefslogtreecommitdiff
path: root/Zend/zend_hash.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2011-04-15 12:43:20 +0000
committerDmitry Stogov <dmitry@php.net>2011-04-15 12:43:20 +0000
commit50ce16deff058dfbf2a04113e4bad1548521bc64 (patch)
treed7dec942b0e67b890d111c00470db675978d09d6 /Zend/zend_hash.c
parent8fe3ea75cb2fc9fe3b6e58340a07aa61f89079b2 (diff)
downloadphp-git-50ce16deff058dfbf2a04113e4bad1548521bc64.tar.gz
Fixed bug #54268 (Double free when destroy_zend_class fails)
Diffstat (limited to 'Zend/zend_hash.c')
-rw-r--r--Zend/zend_hash.c22
1 files changed, 10 insertions, 12 deletions
diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c
index 4ee3cdeb5c..73c45a286c 100644
--- a/Zend/zend_hash.c
+++ b/Zend/zend_hash.c
@@ -563,9 +563,17 @@ ZEND_API void zend_hash_clean(HashTable *ht)
IS_CONSISTENT(ht);
- SET_INCONSISTENT(HT_CLEANING);
-
p = ht->pListHead;
+
+ if (ht->nTableMask) {
+ memset(ht->arBuckets, 0, ht->nTableSize*sizeof(Bucket *));
+ }
+ ht->pListHead = NULL;
+ ht->pListTail = NULL;
+ ht->nNumOfElements = 0;
+ ht->nNextFreeElement = 0;
+ ht->pInternalPointer = NULL;
+
while (p != NULL) {
q = p;
p = p->pListNext;
@@ -577,16 +585,6 @@ ZEND_API void zend_hash_clean(HashTable *ht)
}
pefree(q, ht->persistent);
}
- if (ht->nTableMask) {
- memset(ht->arBuckets, 0, ht->nTableSize*sizeof(Bucket *));
- }
- ht->pListHead = NULL;
- ht->pListTail = NULL;
- ht->nNumOfElements = 0;
- ht->nNextFreeElement = 0;
- ht->pInternalPointer = NULL;
-
- SET_INCONSISTENT(HT_OK);
}
/* This function is used by the various apply() functions.