]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: mempool - Allow calling realloc without knowing block size
authorAki Tuomi <aki.tuomi@open-xchange.com>
Thu, 15 Aug 2024 18:14:06 +0000 (21:14 +0300)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Fri, 17 Jan 2025 08:40:00 +0000 (10:40 +0200)
Supported by some pools only

src/lib/mempool-allocfree.c
src/lib/mempool-alloconly.c
src/lib/mempool-datastack.c
src/lib/mempool-unsafe-datastack.c
src/lib/mempool.h

index 3bbc642ae538fc1879c0b153e861c205871fe774..239db03e0e89713f3cfcc2cac2c67ee2a5ecb228 100644 (file)
@@ -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);
index 798ea84f903021ab36f6322a90e74716c3771a77..79823dc2040750408b97f6b6e525aa5eb91df507 100644 (file)
@@ -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;
 
index 6905f9592e17d32fcd8128802014f9bfad801229..a1985dc3ae9dcfaba12485bee1addbff3672a604 100644 (file)
@@ -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");
index 394fdeb6a18fbf5ad77b3665e1d12023011916b4..08649989c16c08a3f8de76b101f815c0363950ba 100644 (file)
@@ -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;
index d7100e21cba3d54370abc15261b7e9507901ade6..a80303b610a530577c21bcb52b9efc4697d8f83f 100644 (file)
@@ -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)
 {