From: Timo Sirainen Date: Fri, 16 Jan 2009 02:36:26 +0000 (-0500) Subject: mempool system clean: Don't break if realloc() shrinks the memory area. X-Git-Tag: 1.2.beta1~104 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=795197791f05d37d83f18707fcab423d0ba09af7;p=thirdparty%2Fdovecot%2Fcore.git mempool system clean: Don't break if realloc() shrinks the memory area. --HG-- branch : HEAD --- diff --git a/src/lib/mempool-system-clean.c b/src/lib/mempool-system-clean.c index 11dd472e50..49f817b658 100644 --- a/src/lib/mempool-system-clean.c +++ b/src/lib/mempool-system-clean.c @@ -136,6 +136,7 @@ static void *pool_system_clean_realloc(pool_t pool ATTR_UNUSED, void *mem, size_t old_size, size_t new_size) { void *new_mem; + size_t old_alloc_size; if (unlikely(new_size == 0 || new_size > SSIZE_T_MAX)) i_panic("Trying to allocate %"PRIuSIZE_T" bytes", new_size); @@ -146,14 +147,15 @@ static void *pool_system_clean_realloc(pool_t pool ATTR_UNUSED, void *mem, i_assert(old_size == (size_t)-1 || old_size <= malloc_usable_size(mem)); #endif - memcpy(new_mem, mem, mem_get_size(mem)); - pool_system_clean_free(pool, mem); + old_alloc_size = mem_get_size(mem); + memcpy(new_mem, mem, I_MIN(old_alloc_size, new_size)); if (old_size < new_size) { /* clear new data */ memset((char *)new_mem + old_size, 0, new_size - old_size); } + pool_system_clean_free(pool, mem); } return new_mem;