]> granicus.if.org Git - php/commitdiff
Fixed ability to use "internal" heaps in extensions.
authorDmitry Stogov <dmitry@php.net>
Thu, 30 Oct 2008 08:55:09 +0000 (08:55 +0000)
committerDmitry Stogov <dmitry@php.net>
Thu, 30 Oct 2008 08:55:09 +0000 (08:55 +0000)
NEWS
Zend/zend_alloc.c

diff --git a/NEWS b/NEWS
index 23910210481609c5488ae946b8b472c1f6c5ecb0..eda0ce500c0bb560d0627e9c29845f10d45777f1 100644 (file)
--- 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)
index 09ef8aa0aa535a2d76539eb2c0617cfdcb6616a8..40f1c17b9ca4ea9737f3d593664e2c5f9f7bd141 100644 (file)
@@ -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];
                        }