From: W. Felix Handte Date: Tue, 13 Aug 2019 15:57:20 +0000 (-0400) Subject: Align Alloc Pointer When Transitioning from Buffers to Aligned Allocs X-Git-Tag: v1.4.4~1^2~57^2~25 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=88c2fcd0ee13d566fd34886bd3a8ff921eb246db;p=thirdparty%2Fzstd.git Align Alloc Pointer When Transitioning from Buffers to Aligned Allocs --- diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index f081f8388..78a579450 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -64,8 +64,19 @@ static void* ZSTD_workspace_reserve(ZSTD_CCtx_workspace* ws, size_t bytes, ZSTD_ bytes, (BYTE *)alloc - (BYTE *)bottom); assert(phase >= ws->phase); if (phase > ws->phase) { - if (ws->phase <= ZSTD_workspace_alloc_buffers) { - + if (ws->phase < ZSTD_workspace_alloc_buffers && + phase >= ZSTD_workspace_alloc_buffers) { + } + if (ws->phase < ZSTD_workspace_alloc_aligned && + phase >= ZSTD_workspace_alloc_aligned) { + /* If unaligned allocations down from a too-large top have left us + * unaligned, we need to realign our alloc ptr. Technically, this + * can consume space that is unaccounted for in the neededSpace + * calculation. However, I believe this can only happen when the + * workspace is too large, and specifically when it is too large + * by a larger margin than the space that will be consumed. */ + /* TODO: cleaner, compiler warning friendly way to do this??? */ + alloc = (BYTE*)alloc - ((size_t)alloc & (sizeof(U32)-1)); } ws->phase = phase; }