From: Aki Tuomi Date: Thu, 15 Aug 2024 18:14:06 +0000 (+0300) Subject: lib: mempool - Allow calling realloc without knowing block size X-Git-Tag: 2.4.0~342 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5e92a5ebcadeebc9927eefa70bed7b6c9f8b5131;p=thirdparty%2Fdovecot%2Fcore.git lib: mempool - Allow calling realloc without knowing block size Supported by some pools only --- diff --git a/src/lib/mempool-allocfree.c b/src/lib/mempool-allocfree.c index 3bbc642ae5..239db03e0e 100644 --- a/src/lib/mempool-allocfree.c +++ b/src/lib/mempool-allocfree.c @@ -283,6 +283,8 @@ static void *pool_allocfree_realloc(pool_t pool, void *mem, unsigned char *new_mem; struct pool_block *block = pool_block_detach(apool, mem); + if (old_size == SIZE_MAX) + old_size = block->size; if ((new_mem = realloc(block, SIZEOF_POOLBLOCK+new_size)) == NULL) i_fatal_status(FATAL_OUTOFMEM, "realloc(block, %zu)", SIZEOF_POOLBLOCK+new_size); diff --git a/src/lib/mempool-alloconly.c b/src/lib/mempool-alloconly.c index 798ea84f90..79823dc204 100644 --- a/src/lib/mempool-alloconly.c +++ b/src/lib/mempool-alloconly.c @@ -467,6 +467,8 @@ static void *pool_alloconly_realloc(pool_t pool, void *mem, container_of(pool, struct alloconly_pool, pool); unsigned char *new_mem; + i_assert(old_size < SIZE_MAX); + if (new_size <= old_size) return mem; diff --git a/src/lib/mempool-datastack.c b/src/lib/mempool-datastack.c index 6905f9592e..a1985dc3ae 100644 --- a/src/lib/mempool-datastack.c +++ b/src/lib/mempool-datastack.c @@ -162,6 +162,8 @@ static void *pool_data_stack_realloc(pool_t pool, void *mem, container_of(pool, struct datastack_pool, pool); void *new_mem; + i_assert(old_size < SIZE_MAX); + /* @UNSAFE */ if (unlikely(dpool->data_stack_frame != data_stack_frame_id)) i_panic("pool_data_stack_realloc(): stack frame changed"); diff --git a/src/lib/mempool-unsafe-datastack.c b/src/lib/mempool-unsafe-datastack.c index 394fdeb6a1..08649989c1 100644 --- a/src/lib/mempool-unsafe-datastack.c +++ b/src/lib/mempool-unsafe-datastack.c @@ -110,6 +110,8 @@ static void *pool_unsafe_data_stack_realloc(pool_t pool ATTR_UNUSED, { void *new_mem; + i_assert(old_size < SIZE_MAX); + /* @UNSAFE */ if (old_size >= new_size) return mem; diff --git a/src/lib/mempool.h b/src/lib/mempool.h index d7100e21cb..a80303b610 100644 --- a/src/lib/mempool.h +++ b/src/lib/mempool.h @@ -121,6 +121,8 @@ p_malloc(pool_t pool, size_t size) return pool->v->malloc(pool, size); } +/* For allocfree and system pools you can use SIZE_MAX + to indicate that you have no knowlege of the old size. */ static inline void * ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL p_realloc(pool_t pool, void *mem, size_t old_size, size_t new_size) {