summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStanislav Malyshev <stas@php.net>2016-08-14 19:07:15 -0700
committerAnatol Belski <ab@php.net>2016-08-17 11:31:26 +0200
commit326ac100ac016cd5fc2c7367c97d64fa4b6932df (patch)
tree914edc72c77fcc13e60be0d57f460776507d0f4d
parent19c10bb629139c42f55f10c9c84dfe3ba29567c6 (diff)
downloadphp-git-326ac100ac016cd5fc2c7367c97d64fa4b6932df.tar.gz
Fix bug #72742 - memory allocator fails to realloc small block to large one
(cherry picked from commit c2a13ced4272f2e65d2773e2ea6ca11c1ce4a911)
-rw-r--r--Zend/zend_alloc.c24
1 files changed, 12 insertions, 12 deletions
diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c
index 1876559317..a79d67b4b9 100644
--- a/Zend/zend_alloc.c
+++ b/Zend/zend_alloc.c
@@ -1548,21 +1548,21 @@ static void *zend_mm_realloc_heap(zend_mm_heap *heap, void *ptr, size_t size, si
ZEND_MM_CHECK(chunk->heap == heap, "zend_mm_heap corrupted");
if (info & ZEND_MM_IS_SRUN) {
- int old_bin_num, bin_num;
-
- old_bin_num = ZEND_MM_SRUN_BIN_NUM(info);
+ int old_bin_num = ZEND_MM_SRUN_BIN_NUM(info);
old_size = bin_data_size[old_bin_num];
- bin_num = ZEND_MM_SMALL_SIZE_TO_BIN(size);
- if (old_bin_num == bin_num) {
+ if (size <= ZEND_MM_MAX_SMALL_SIZE) {
+ int bin_num = ZEND_MM_SMALL_SIZE_TO_BIN(size);
+ if (old_bin_num == bin_num) {
#if ZEND_DEBUG
- dbg = zend_mm_get_debug_info(heap, ptr);
- dbg->size = real_size;
- dbg->filename = __zend_filename;
- dbg->orig_filename = __zend_orig_filename;
- dbg->lineno = __zend_lineno;
- dbg->orig_lineno = __zend_orig_lineno;
+ dbg = zend_mm_get_debug_info(heap, ptr);
+ dbg->size = real_size;
+ dbg->filename = __zend_filename;
+ dbg->orig_filename = __zend_orig_filename;
+ dbg->lineno = __zend_lineno;
+ dbg->orig_lineno = __zend_orig_lineno;
#endif
- return ptr;
+ return ptr;
+ }
}
} else /* if (info & ZEND_MM_IS_LARGE_RUN) */ {
ZEND_MM_CHECK(ZEND_MM_ALIGNED_OFFSET(page_offset, ZEND_MM_PAGE_SIZE) == 0, "zend_mm_heap corrupted");