From ff7ac2d9a0e5873d897379d7851e72c9874bc9ca Mon Sep 17 00:00:00 2001 From: Krisztian Litkey Date: Sat, 2 Mar 2013 00:25:28 +0200 Subject: [PATCH] common: handle realloc to 0 size gracefully as free in debug mode. --- src/common/mm.c | 78 +++++++++++++++++++++++++++++++-------------------------- 1 file changed, 42 insertions(+), 36 deletions(-) diff --git a/src/common/mm.c b/src/common/mm.c index f50570d..4bda3d8 100644 --- a/src/common/mm.c +++ b/src/common/mm.c @@ -157,6 +157,28 @@ static memblk_t *memblk_alloc(size_t size, const char *file, int line, } +static void memblk_free(memblk_t *blk, const char *file, int line, + const char *func, void **bt) +{ + MRP_UNUSED(file); + MRP_UNUSED(line); + MRP_UNUSED(func); + MRP_UNUSED(bt); + + if (blk != NULL) { + mrp_list_delete(&blk->hook); + + __mm.cur_blocks--; + __mm.cur_alloc -= blk->size; + + if (__mm.poison != 0) + memset(&blk->bt[__mm.depth], __mm.poison, blk->size); + + free(blk); + } +} + + static memblk_t *memblk_resize(memblk_t *blk, size_t size, const char *file, int line, const char *func, void **bt) { @@ -165,27 +187,33 @@ static memblk_t *memblk_resize(memblk_t *blk, size_t size, const char *file, if (blk != NULL) { mrp_list_delete(&blk->hook); - resized = realloc(blk, __mm.hdrsize + size); + if (size != 0) { + resized = realloc(blk, __mm.hdrsize + size); - if (resized != NULL) { - mrp_list_init(&resized->hook); + if (resized != NULL) { + mrp_list_init(&resized->hook); - mrp_list_append(&__mm.blocks, &resized->hook); + mrp_list_append(&__mm.blocks, &resized->hook); - __mm.cur_alloc -= resized->size; - __mm.cur_alloc += size; - __mm.max_alloc = MRP_MAX(__mm.max_alloc, __mm.cur_alloc); + __mm.cur_alloc -= resized->size; + __mm.cur_alloc += size; + __mm.max_alloc = MRP_MAX(__mm.max_alloc, __mm.cur_alloc); - resized->file = file; - resized->line = line; - resized->func = func; + resized->file = file; + resized->line = line; + resized->func = func; - memcpy(resized->bt, bt, __mm.depth * sizeof(*bt)); + memcpy(resized->bt, bt, __mm.depth * sizeof(*bt)); - resized->size = size; + resized->size = size; + } + else + mrp_list_append(&__mm.blocks, &blk->hook); + } + else { + resized = NULL; + memblk_free(blk, file, line, func, bt); } - else - mrp_list_append(&__mm.blocks, &blk->hook); return resized; } @@ -194,28 +222,6 @@ static memblk_t *memblk_resize(memblk_t *blk, size_t size, const char *file, } -static void memblk_free(memblk_t *blk, const char *file, int line, - const char *func, void **bt) -{ - MRP_UNUSED(file); - MRP_UNUSED(line); - MRP_UNUSED(func); - MRP_UNUSED(bt); - - if (blk != NULL) { - mrp_list_delete(&blk->hook); - - __mm.cur_blocks--; - __mm.cur_alloc -= blk->size; - - if (__mm.poison != 0) - memset(&blk->bt[__mm.depth], __mm.poison, blk->size); - - free(blk); - } -} - - static inline void *memblk_to_ptr(memblk_t *blk) { if (blk != NULL) -- 2.7.4