summaryrefslogtreecommitdiff
path: root/Zend/zend_alloc.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2008-02-14 14:42:00 +0000
committerDmitry Stogov <dmitry@php.net>2008-02-14 14:42:00 +0000
commite563a6d979538a64d3d78400a799023ee2aabec4 (patch)
tree795dba55b70a60613935ebe70814325804565f83 /Zend/zend_alloc.c
parentd972e43b1d24bb20f1edba8e328f1e349bf2eb02 (diff)
downloadphp-git-e563a6d979538a64d3d78400a799023ee2aabec4.tar.gz
Fixed bug #44069 (Huge memory usage with concatenation using . instead of .=)
Diffstat (limited to 'Zend/zend_alloc.c')
-rw-r--r--Zend/zend_alloc.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c
index 2b53945bc8..b66db7937f 100644
--- a/Zend/zend_alloc.c
+++ b/Zend/zend_alloc.c
@@ -1748,6 +1748,7 @@ static void *_zend_mm_alloc_int(zend_mm_heap *heap, size_t size ZEND_FILE_LINE_D
size_t remaining_size;
size_t segment_size;
zend_mm_segment *segment;
+ int keep_rest = 0;
if (EXPECTED(ZEND_MM_SMALL_SIZE(true_size))) {
size_t index = ZEND_MM_BUCKET_INDEX(true_size);
@@ -1816,6 +1817,7 @@ static void *_zend_mm_alloc_int(zend_mm_heap *heap, size_t size ZEND_FILE_LINE_D
segment must have header "size" and trailer "guard" block */
segment_size = true_size + ZEND_MM_ALIGNED_SEGMENT_SIZE + ZEND_MM_ALIGNED_HEADER_SIZE;
segment_size = (segment_size + (heap->block_size-1)) & ~(heap->block_size-1);
+ keep_rest = 1;
} else {
segment_size = heap->block_size;
}
@@ -1895,7 +1897,11 @@ zend_mm_finished_searching_for_block:
ZEND_MM_BLOCK(new_free_block, ZEND_MM_FREE_BLOCK, remaining_size);
/* add the new free block to the free list */
- zend_mm_add_to_free_list(heap, new_free_block);
+ if (EXPECTED(!keep_rest)) {
+ zend_mm_add_to_free_list(heap, new_free_block);
+ } else {
+ zend_mm_add_to_rest_list(heap, new_free_block);
+ }
}
ZEND_MM_SET_DEBUG_INFO(best_fit, size, 1, 1);