]> granicus.if.org Git - php/commitdiff
Fixed bug #40770 (Apache child exits when PHP memory limit reached)
authorDmitry Stogov <dmitry@php.net>
Mon, 12 Mar 2007 16:59:52 +0000 (16:59 +0000)
committerDmitry Stogov <dmitry@php.net>
Mon, 12 Mar 2007 16:59:52 +0000 (16:59 +0000)
NEWS
Zend/tests/bug40770.phpt [new file with mode: 0755]
Zend/zend_alloc.c

diff --git a/NEWS b/NEWS
index 998b827aef38be5169d16a9227dd9d375dbb0b04..26f998b9258eb2b6aef5c762665d80ae35f303ef 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -18,6 +18,7 @@ PHP                                                                        NEWS
 - Fixed a thread safety issue in gd gif read code (Nuno, Roman Nemecek)
 - Fixed CVE-2007-1001, GD wbmp used with invalid image size (Pierre)
 - Fixed bug #40784 (Case sensivity in constructor's fallback). (Tony)
+- Fixed bug #40770 (Apache child exits when PHP memory limit reached). (Dmitry)
 - Fixed bug #40764 (line thickness not respected for horizontal and vertical 
   lines). (Pierre)
 - Fixed bug #40754 (added substr() & substr_replace() overflow checks). (Ilia)
diff --git a/Zend/tests/bug40770.phpt b/Zend/tests/bug40770.phpt
new file mode 100755 (executable)
index 0000000..fd01303
--- /dev/null
@@ -0,0 +1,15 @@
+--TEST--
+Bug #40770 Apache child exits when PHP memory limit reached 
+--INI--
+memory_limit=64M
+--FILE--
+<?php
+ini_set('display_errors',true);
+$mb=148;
+$var = '';
+for ($i=0; $i<=$mb; $i++) {
+        $var.= str_repeat('a',1*1024*1024);
+}
+?>
+--EXPECTF--
+Fatal error: Allowed memory size of 67108864 bytes exhausted%s(tried to allocate %d bytes) in %sbug40770.php on line 6
index 736b6303e2b248c24222ad9abc776591b99b7b66..34f5b77b60728276b387c03796067d7ffe47f14e 100644 (file)
@@ -1714,6 +1714,9 @@ realloc_segment:
                segment_copy = (zend_mm_segment *) ((char *)mm_block - ZEND_MM_ALIGNED_SEGMENT_SIZE);
                if (segment_size < true_size ||
                    heap->real_size + segment_size - segment_copy->size > heap->limit) {
+                       if (ZEND_MM_IS_FREE_BLOCK(next_block)) {
+                               zend_mm_add_to_free_list(heap, (zend_mm_free_block *) next_block);
+                       }
 #if ZEND_MM_CACHE
                        zend_mm_free_cache(heap);
 #endif