From 80e3e7034e84e7ff250d7f992ac7337551f800e8 Mon Sep 17 00:00:00 2001 From: Eddy Jansson Date: Sat, 31 Jul 2021 18:59:15 +0200 Subject: Define LZ4_STREAMSIZE in terms of LZ4_MEMORY_USAGE This is required to correctly size a static member to hold the hash table, whose size is derived from LZ4_MEMORY_USAGE. --- lib/lz4.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/lz4.h b/lib/lz4.h index 0b11eab..a520adc 100644 --- a/lib/lz4.h +++ b/lib/lz4.h @@ -620,7 +620,7 @@ typedef struct { * note : only use this definition in association with static linking ! * this definition is not API/ABI safe, and may change in future versions. */ -#define LZ4_STREAMSIZE 16416 /* static size, for inter-version compatibility */ +#define LZ4_STREAMSIZE ((1UL << LZ4_MEMORY_USAGE) + 32) /* static size, for inter-version compatibility */ #define LZ4_STREAMSIZE_VOIDP (LZ4_STREAMSIZE / sizeof(void*)) union LZ4_stream_u { void* table[LZ4_STREAMSIZE_VOIDP]; -- cgit v0.12 From 0a0922067fdb684c2c79169cc9b02118b905a6b9 Mon Sep 17 00:00:00 2001 From: Eddy Jansson Date: Sat, 31 Jul 2021 18:59:54 +0200 Subject: Don't reuse state memory that's too small. Ensure that the memory block we're trying to reuse is large enough for the new state. Fixes #974 --- lib/lz4frame.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/lz4frame.c b/lib/lz4frame.c index 21dc47f..9069717 100644 --- a/lib/lz4frame.c +++ b/lib/lz4frame.c @@ -588,6 +588,16 @@ static void LZ4F_initStream(void* ctx, } } +static int ctxTypeID_to_size(int ctxTypeID) { + switch(ctxTypeID) { + case 1: + return LZ4_sizeofState(); + case 2: + return LZ4_sizeofStateHC(); + default: + return 0; + } +} /*! LZ4F_compressBegin_usingCDict() : * init streaming compression AND writes frame header into @dstBuffer. @@ -610,7 +620,9 @@ size_t LZ4F_compressBegin_usingCDict(LZ4F_cctx* cctxPtr, /* cctx Management */ { U16 const ctxTypeID = (cctxPtr->prefs.compressionLevel < LZ4HC_CLEVEL_MIN) ? 1 : 2; - if (cctxPtr->lz4CtxAlloc < ctxTypeID) { + int requiredSize = ctxTypeID_to_size(ctxTypeID); + int allocatedSize = ctxTypeID_to_size(cctxPtr->lz4CtxAlloc); + if (allocatedSize < requiredSize) { /* not enough space allocated */ FREEMEM(cctxPtr->lz4CtxPtr); if (cctxPtr->prefs.compressionLevel < LZ4HC_CLEVEL_MIN) { -- cgit v0.12