From 66509c7bf42dda5c76e2269f20392fd44cd0fd0f Mon Sep 17 00:00:00 2001 From: "W. Felix Handte" Date: Wed, 2 Sep 2020 17:29:46 -0400 Subject: [PATCH] Only Insert Positions Inside the Chain Window --- lib/compress/zstd_lazy.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/compress/zstd_lazy.c b/lib/compress/zstd_lazy.c index 5ce805326..c61f8aee4 100644 --- a/lib/compress/zstd_lazy.c +++ b/lib/compress/zstd_lazy.c @@ -480,8 +480,10 @@ void ZSTD_dedicatedDictSearch_lazy_loadDictionary(ZSTD_matchState_t* ms, const B { U32 const target = (U32)(ip - ms->window.base); U32* const chainTable = ms->chainTable; - U32 const chainMask = (1 << ms->cParams.chainLog) - 1; + U32 const chainSize = 1 << ms->cParams.chainLog; + U32 const chainMask = chainSize - 1; U32 idx = ms->nextToUpdate; + U32 const minChain = chainSize > target ? 0 : target - chainSize; U32 bucketSize = 1 << ZSTD_LAZY_DDSS_BUCKET_LOG; for ( ; idx < target; idx++) { U32 i; @@ -493,7 +495,9 @@ void ZSTD_dedicatedDictSearch_lazy_loadDictionary(ZSTD_matchState_t* ms, const B for (i = bucketSize - 1; i; i--) ms->hashTable[h + i] = ms->hashTable[h + i - 1]; /* Insert new position. */ - chainTable[idx & chainMask] = ms->hashTable[h]; + if (idx >= minChain) { + chainTable[idx & chainMask] = ms->hashTable[h]; + } ms->hashTable[h] = idx; }