From 88c2fcd0ee13d566fd34886bd3a8ff921eb246db Mon Sep 17 00:00:00 2001 From: "W. Felix Handte" Date: Tue, 13 Aug 2019 11:57:20 -0400 Subject: [PATCH] Align Alloc Pointer When Transitioning from Buffers to Aligned Allocs --- lib/compress/zstd_compress.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) 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; } -- 2.47.3