]> granicus.if.org Git - php/commitdiff
Handle out of memory/bad size situation gracefully, without getting into loop
authorStanislav Malyshev <stas@php.net>
Thu, 4 Mar 2004 09:18:05 +0000 (09:18 +0000)
committerStanislav Malyshev <stas@php.net>
Thu, 4 Mar 2004 09:18:05 +0000 (09:18 +0000)
Zend/zend_mm.c

index 1dc57ba0c5b0b5c67a6c093faf476b8740b138e0..71a24c11eaa0d148d235cd51b7c6e0c766625064 100644 (file)
@@ -318,9 +318,15 @@ zend_mm_finished_searching_for_block:
        if (!best_fit) {
                if (true_size > (heap->block_size - ZEND_MM_ALIGNED_SEGMENT_SIZE - ZEND_MM_ALIGNED_HEADER_SIZE)) {
                        /* Make sure we add a memory block which is big enough */
-                       zend_mm_add_memory_block(heap, true_size + ZEND_MM_ALIGNED_SEGMENT_SIZE + ZEND_MM_ALIGNED_HEADER_SIZE);
+                       if (zend_mm_add_memory_block(heap, true_size + ZEND_MM_ALIGNED_SEGMENT_SIZE + ZEND_MM_ALIGNED_HEADER_SIZE)) {
+                               zend_error(E_ERROR, "Out of memory: cannot allocate %d bytes!", true_size);
+                               return NULL;
+                       }
                } else {
-                       zend_mm_add_memory_block(heap, heap->block_size);
+                       if (zend_mm_add_memory_block(heap, heap->block_size)) {
+                               zend_error(E_ERROR, "Out of memory: cannot allocate %d bytes!", heap->block_size);
+                               return NULL;
+                       }
                }
                return zend_mm_alloc(heap, size);
        }