From 49c8a68100292571b31999bae2853ccca61f6894 Mon Sep 17 00:00:00 2001 From: Josef 'Jeff' Sipek Date: Wed, 20 Jun 2018 11:47:26 -0400 Subject: [PATCH] lib: mempool - Centralize p_realloc() NULL pointer check Instead of each mempool implementation having to check the pointer passed in for being NULL, we can check that the sizes are within the required bounds in p_realloc(). --- src/lib/mempool-allocfree.c | 3 --- src/lib/mempool-alloconly.c | 3 --- src/lib/mempool-datastack.c | 3 --- src/lib/mempool-system.c | 4 ---- src/lib/mempool-unsafe-datastack.c | 3 --- src/lib/mempool.h | 3 +++ 6 files changed, 3 insertions(+), 16 deletions(-) diff --git a/src/lib/mempool-allocfree.c b/src/lib/mempool-allocfree.c index 0ecb29d8e3..4a53a91fae 100644 --- a/src/lib/mempool-allocfree.c +++ b/src/lib/mempool-allocfree.c @@ -282,9 +282,6 @@ static void *pool_allocfree_realloc(pool_t pool, void *mem, container_of(pool, struct allocfree_pool, pool); unsigned char *new_mem; - if (mem == NULL) - return pool_allocfree_malloc(pool, new_size); - struct pool_block *block = pool_block_detach(apool, mem); if ((new_mem = realloc(block, SIZEOF_POOLBLOCK+new_size)) == NULL) i_fatal_status(FATAL_OUTOFMEM, "realloc(block, %"PRIuSIZE_T")", diff --git a/src/lib/mempool-alloconly.c b/src/lib/mempool-alloconly.c index 2f4845b57a..c6673b3b4f 100644 --- a/src/lib/mempool-alloconly.c +++ b/src/lib/mempool-alloconly.c @@ -451,9 +451,6 @@ static void *pool_alloconly_realloc(pool_t pool, void *mem, container_of(pool, struct alloconly_pool, pool); unsigned char *new_mem; - if (mem == NULL) - return pool_alloconly_malloc(pool, new_size); - if (new_size <= old_size) return mem; diff --git a/src/lib/mempool-datastack.c b/src/lib/mempool-datastack.c index 12d31f14ef..b3c1094bf0 100644 --- a/src/lib/mempool-datastack.c +++ b/src/lib/mempool-datastack.c @@ -166,9 +166,6 @@ static void *pool_data_stack_realloc(pool_t pool, void *mem, if (unlikely(dpool->data_stack_frame != data_stack_frame_id)) i_panic("pool_data_stack_realloc(): stack frame changed"); - if (mem == NULL) - return pool_data_stack_malloc(pool, new_size); - if (old_size >= new_size) return mem; diff --git a/src/lib/mempool-system.c b/src/lib/mempool-system.c index fcd8636848..06e0bcbe8c 100644 --- a/src/lib/mempool-system.c +++ b/src/lib/mempool-system.c @@ -132,10 +132,6 @@ void pool_system_free(pool_t pool ATTR_UNUSED, void *mem ATTR_UNUSED) static void *pool_system_realloc(pool_t pool ATTR_UNUSED, void *mem, size_t old_size, size_t new_size) { - if (mem == NULL) { - i_assert(old_size == 0); - return pool_system_malloc(pool, new_size); - } #if defined(HAVE_MALLOC_USABLE_SIZE) i_assert(old_size == (size_t)-1 || mem == NULL || old_size <= malloc_usable_size(mem)); diff --git a/src/lib/mempool-unsafe-datastack.c b/src/lib/mempool-unsafe-datastack.c index db5d39e9b1..2f2751ddc8 100644 --- a/src/lib/mempool-unsafe-datastack.c +++ b/src/lib/mempool-unsafe-datastack.c @@ -111,9 +111,6 @@ static void *pool_unsafe_data_stack_realloc(pool_t pool ATTR_UNUSED, void *new_mem; /* @UNSAFE */ - if (mem == NULL) - return pool_unsafe_data_stack_malloc(pool, new_size); - if (old_size >= new_size) return mem; diff --git a/src/lib/mempool.h b/src/lib/mempool.h index f5a613ece3..cd8db7ec9c 100644 --- a/src/lib/mempool.h +++ b/src/lib/mempool.h @@ -113,6 +113,9 @@ p_realloc(pool_t pool, void *mem, size_t old_size, size_t new_size) if (unlikely(new_size == 0 || new_size > POOL_MAX_ALLOC_SIZE)) i_panic("Trying to allocate %" PRIuSIZE_T " bytes", new_size); + if (mem == NULL) + return pool->v->malloc(pool, new_size); + return pool->v->realloc(pool, mem, old_size, new_size); } -- 2.47.3