From e173d6158134ff8a475eaf4d44e86c10b784782c Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 30 Oct 2008 08:55:09 +0000 Subject: [PATCH] Fixed ability to use "internal" heaps in extensions. --- NEWS | 1 + Zend/zend_alloc.c | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index 2391021048..eda0ce500c 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,7 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? Nov 2008, PHP 5.2.7RC3 +- Fixed ability to use "internal" heaps in extensions. (Felipe, Dmitry) - Updated timezone database to version 2008.9. (Derick) - Fixed bug #46406 (Unregistering nodeclass throws E_FATAL). (Rob) diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c index 09ef8aa0aa..40f1c17b9c 100644 --- a/Zend/zend_alloc.c +++ b/Zend/zend_alloc.c @@ -1061,16 +1061,26 @@ ZEND_API zend_mm_heap *zend_mm_startup_ex(const zend_mm_mem_handlers *handlers, } if (internal) { int i; - zend_mm_free_block *p; + zend_mm_free_block *p, *q, *orig; zend_mm_heap *mm_heap = _zend_mm_alloc_int(heap, sizeof(zend_mm_heap) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC); *mm_heap = *heap; p = ZEND_MM_SMALL_FREE_BUCKET(mm_heap, 0); + orig = ZEND_MM_SMALL_FREE_BUCKET(heap, 0); for (i = 0; i < ZEND_MM_NUM_BUCKETS; i++) { - p->prev_free_block->next_free_block = p; - p->next_free_block->prev_free_block = p; + q = p; + while (q->prev_free_block != orig) { + q = q->prev_free_block; + } + q->prev_free_block = p; + q = p; + while (q->next_free_block != orig) { + q = q->next_free_block; + } + q->next_free_block = p; p = (zend_mm_free_block*)((char*)p + sizeof(zend_mm_free_block*) * 2); + orig = (zend_mm_free_block*)((char*)orig + sizeof(zend_mm_free_block*) * 2); if (mm_heap->large_free_buckets[i]) { mm_heap->large_free_buckets[i]->parent = &mm_heap->large_free_buckets[i]; } -- 2.40.0