From d8335be6c08009d0ae9dc579e43ff96ca6ddafc0 Mon Sep 17 00:00:00 2001 From: Krisztian Litkey Date: Sat, 16 Mar 2013 13:16:23 +0200 Subject: [PATCH] common: make sure *alloc(0) returns NULL. The C standard allows [mc]alloc(0) to return a unique non-NULL pointer instead of NULL and indeed the stock allocator in recent versions of glibc does behave this way. We prefer our zero-sized chunks of memory to be represented by NULL, so we take care of this in the allocator wrappers. --- src/common/mm.c | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/src/common/mm.c b/src/common/mm.c index 030d7ad..4b9222f 100644 --- a/src/common/mm.c +++ b/src/common/mm.c @@ -284,23 +284,27 @@ static memblk_t *memblk_alloc(size_t size, const char *file, int line, { memblk_t *blk; - if ((blk = malloc(__mm.hdrsize + size)) != NULL) { - mrp_list_init(&blk->hook); - mrp_list_init(&blk->more); - mrp_list_append(&__mm.blocks, &blk->hook); + if (MRP_UNLIKELY(size == 0)) + blk = NULL; + else { + if ((blk = malloc(__mm.hdrsize + size)) != NULL) { + mrp_list_init(&blk->hook); + mrp_list_init(&blk->more); + mrp_list_append(&__mm.blocks, &blk->hook); - blk->file = file; - blk->line = line; - blk->func = func; - blk->size = size; + blk->file = file; + blk->line = line; + blk->func = func; + blk->size = size; - memcpy(blk->bt, bt, __mm.depth * sizeof(*bt)); + memcpy(blk->bt, bt, __mm.depth * sizeof(*bt)); - __mm.cur_blocks++; - __mm.cur_alloc += size; + __mm.cur_blocks++; + __mm.cur_alloc += size; - __mm.max_blocks = MRP_MAX(__mm.max_blocks, __mm.cur_blocks); - __mm.max_alloc = MRP_MAX(__mm.max_alloc , __mm.cur_alloc); + __mm.max_blocks = MRP_MAX(__mm.max_blocks, __mm.cur_blocks); + __mm.max_alloc = MRP_MAX(__mm.max_alloc , __mm.cur_alloc); + } } return blk; @@ -487,7 +491,10 @@ static void *__passthru_alloc(size_t size, const char *file, int line, MRP_UNUSED(line); MRP_UNUSED(func); - return malloc(size); + if (MRP_UNLIKELY(size == 0)) + return NULL; + else + return malloc(size); } -- 2.7.4