diff options
Diffstat (limited to 'Zend/zend_list.c')
-rw-r--r-- | Zend/zend_list.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/Zend/zend_list.c b/Zend/zend_list.c index 5f13b83937..a4a567b26d 100644 --- a/Zend/zend_list.c +++ b/Zend/zend_list.c @@ -231,10 +231,35 @@ int zend_init_rsrc_plist(ELS_D) void zend_destroy_rsrc_list(ELS_D) { - zend_hash_reverse_destroy(&EG(regular_list)); + Bucket *p, *q; + HashTable *ht = &EG(regular_list); + + while (1) { + p = ht->pListTail; + if (!p) { + break; + } + q = p->pListLast; + if (q) { + q->pListNext = NULL; + } + ht->pListTail = q; + + if (ht->pDestructor) { + if (setjmp(EG(bailout))==0) { + ht->pDestructor(p->pData); + } + } + if (!p->pDataPtr && p->pData) { + pefree(p->pData, ht->persistent); + } + pefree(p, ht->persistent); + } + pefree(ht->arBuckets, ht->persistent); } + void zend_destroy_rsrc_plist(ELS_D) { zend_hash_reverse_destroy(&EG(persistent_list)); |