From: Timo Sirainen Date: Mon, 27 Nov 2017 13:17:52 +0000 (+0200) Subject: lib: mempool-alloconly - Cleanly fail allocations just below SSIZE_T_MAX X-Git-Tag: 2.3.0.rc1~327 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e4a7dbe5e02280e561d9ac438326ed70700cd39b;p=thirdparty%2Fdovecot%2Fcore.git lib: mempool-alloconly - Cleanly fail allocations just below SSIZE_T_MAX Previously it would have assert-crashed in nearest_power(). --- diff --git a/src/lib/mempool-alloconly.c b/src/lib/mempool-alloconly.c index 66ba6bfcc2..ab8c37b3c6 100644 --- a/src/lib/mempool-alloconly.c +++ b/src/lib/mempool-alloconly.c @@ -5,8 +5,12 @@ #include "safe-memset.h" #include "mempool.h" - -#define MAX_ALLOC_SIZE SSIZE_T_MAX +#ifndef DEBUG +# define POOL_ALLOCONLY_MAX_EXTRA MEM_ALIGN(1) +#else +# define POOL_ALLOCONLY_MAX_EXTRA \ + (MEM_ALIGN(sizeof(size_t)) + MEM_ALIGN(1) + MEM_ALIGN(SENTRY_COUNT)) +#endif struct alloconly_pool { struct pool pool; @@ -260,7 +264,7 @@ static void *pool_alloconly_malloc(pool_t pool, size_t size) void *mem; size_t alloc_size; - if (unlikely(size == 0 || size > SSIZE_T_MAX)) + if (unlikely(size == 0 || size > SSIZE_T_MAX - POOL_ALLOCONLY_MAX_EXTRA)) i_panic("Trying to allocate %"PRIuSIZE_T" bytes", size); #ifndef DEBUG @@ -328,7 +332,7 @@ static void *pool_alloconly_realloc(pool_t pool, void *mem, struct alloconly_pool *apool = (struct alloconly_pool *)pool; unsigned char *new_mem; - if (unlikely(new_size == 0 || new_size > SSIZE_T_MAX)) + if (unlikely(new_size == 0 || new_size > SSIZE_T_MAX - POOL_ALLOCONLY_MAX_EXTRA)) i_panic("Trying to allocate %"PRIuSIZE_T" bytes", new_size); if (mem == NULL)