libmicrohttpd

HTTP/1.x server C library (MHD 1.x, stable)
Log | Files | Refs | Submodules | README | LICENSE

commit 3cb0b6cf17e2cc6cd62133a0beffa998b1e53c23
parent 03df91fc4cb9120959945cb39a0576acdaee1a3b
Author: Evgeny Grin (Karlson2k) <k2k@narod.ru>
Date:   Sun, 16 Jun 2019 22:57:10 +0300

MHD_pool_reallocate(): never allocate additional buffer when shrinking

Diffstat:
Msrc/microhttpd/memorypool.c | 13++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/src/microhttpd/memorypool.c b/src/microhttpd/memorypool.c @@ -321,15 +321,16 @@ MHD_pool_reallocate (struct MemoryPool *pool, if (0 != old_size) { /* Need to save some data */ const size_t old_offset = (uint8_t*)old - pool->memory; + const bool shrinking = (old_size > new_size); /* Try resizing in-place */ + if (shrinking) + { /* Shrinking in-place, zero-out freed part */ + memset ((uint8_t*)old + new_size, 0, old_size - new_size); + } if (pool->pos == ROUND_TO_ALIGN (old_offset + old_size)) { /* "old" block is the last allocated block */ const size_t new_apos = ROUND_TO_ALIGN (old_offset + new_size); - if (old_size > new_size) - { /* Shrinking in-place, zero-out freed part */ - memset ((uint8_t*)old + new_size, 0, old_size - new_size); - } - else + if (!shrinking) { /* Grow in-place, check for enough space. */ if ( (new_apos > pool->end) || (new_apos < pool->pos) ) /* Value wrap */ @@ -339,6 +340,8 @@ MHD_pool_reallocate (struct MemoryPool *pool, pool->pos = new_apos; return old; } + if (shrinking) + return old; /* Resized in-place, freed part remains allocated */ } /* Need to allocate new block */ asize = ROUND_TO_ALIGN (new_size);