From: W. Felix Handte Date: Mon, 21 May 2018 22:27:08 +0000 (-0400) Subject: Fixes in re Comments X-Git-Tag: v1.3.5~3^2~44^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7ef85e061877d96991a4fc419ad96146afc8f88b;p=thirdparty%2Fzstd.git Fixes in re Comments --- diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index b1d52b9aa..e49046fcb 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -1207,11 +1207,12 @@ static size_t ZSTD_resetCCtx_usingCDict(ZSTD_CCtx* cctx, /* We have a choice between copying the dictionary context into the working * context, or referencing the dictionary context from the working context * in-place. We decide here which strategy to use. */ - int attachDict = ( pledgedSrcSize <= 8 KB - || pledgedSrcSize == ZSTD_CONTENTSIZE_UNKNOWN ) - && cdict->cParams.strategy == ZSTD_fast - && ZSTD_equivalentCParams(cctx->appliedParams.cParams, - cdict->cParams); + const int attachDict = ( pledgedSrcSize <= 8 KB + || pledgedSrcSize == ZSTD_CONTENTSIZE_UNKNOWN ) + && cdict->cParams.strategy == ZSTD_fast + && ZSTD_equivalentCParams(cctx->appliedParams.cParams, + cdict->cParams); + { unsigned const windowLog = params.cParams.windowLog; assert(windowLog != 0); @@ -1227,7 +1228,9 @@ static size_t ZSTD_resetCCtx_usingCDict(ZSTD_CCtx* cctx, } if (attachDict) { - if (cdict->matchState.window.nextSrc - cdict->matchState.window.base == 0) { + const U32 cdictLen = (U32)( cdict->matchState.window.nextSrc + - cdict->matchState.window.base); + if (cdictLen == 0) { /* don't even attach dictionaries with no contents */ DEBUGLOG(4, "skipping attaching empty dictionary"); } else { @@ -1236,15 +1239,12 @@ static size_t ZSTD_resetCCtx_usingCDict(ZSTD_CCtx* cctx, /* prep working match state so dict matches never have negative indices * when they are translated to the working context's index space. */ - if (cctx->blockState.matchState.window.dictLimit < - (U32)(cdict->matchState.window.nextSrc - cdict->matchState.window.base)) { + if (cctx->blockState.matchState.window.dictLimit < cdictLen) { cctx->blockState.matchState.window.nextSrc = - cctx->blockState.matchState.window.base + - ( cdict->matchState.window.nextSrc - - cdict->matchState.window.base); + cctx->blockState.matchState.window.base + cdictLen; ZSTD_window_clear(&cctx->blockState.matchState.window); } - cctx->blockState.matchState.loadedDictEnd = cctx->blockState.matchState.window.dictLimit; + cctx->blockState.matchState.loadedDictEnd = params.forceWindow ? 0 : cdictLen; } } else { DEBUGLOG(4, "copying dictionary into context"); diff --git a/lib/compress/zstd_fast.c b/lib/compress/zstd_fast.c index b21bc7683..3bac2bddd 100644 --- a/lib/compress/zstd_fast.c +++ b/lib/compress/zstd_fast.c @@ -74,6 +74,7 @@ size_t ZSTD_compressBlock_fast_generic( const U32 dictIndexDelta = dictMode == ZSTD_dictMatchState ? prefixLowestIndex - (U32)(dictEnd - dictBase) : 0; + const U32 dictAndPrefixLength = (U32)(ip - prefixLowest + dictEnd - dictLowest); assert(dictMode == ZSTD_noDict || dictMode == ZSTD_dictMatchState); @@ -83,13 +84,18 @@ size_t ZSTD_compressBlock_fast_generic( || prefixLowestIndex >= (U32)(dictEnd - dictBase)); /* init */ - ip += (ip - prefixLowest + dictEnd - dictLowest == 0); - { U32 const maxRep = dictMode == ZSTD_dictMatchState ? - (U32)(ip - prefixLowest + dictEnd - dictLowest) : - (U32)(ip - prefixLowest); + ip += (dictAndPrefixLength == 0); + if (dictMode == ZSTD_noDict) { + U32 const maxRep = (U32)(ip - prefixLowest); if (offset_2 > maxRep) offsetSaved = offset_2, offset_2 = 0; if (offset_1 > maxRep) offsetSaved = offset_1, offset_1 = 0; } + if (dictMode == ZSTD_dictMatchState) { + /* dictMatchState repCode checks don't currently handle repCode == 0 + * disabling. */ + assert(offset_1 <= dictAndPrefixLength); + assert(offset_2 <= dictAndPrefixLength); + } /* Main Search Loop */ while (ip < ilimit) { /* < instead of <=, because repcode check at (ip+1) */ @@ -169,8 +175,7 @@ size_t ZSTD_compressBlock_fast_generic( while (ip <= ilimit) { U32 const current2 = (U32)(ip-base); U32 const repIndex2 = current2 - offset_2; - const BYTE* repMatch2 = dictMode == ZSTD_dictMatchState - && repIndex2 < prefixLowestIndex ? + const BYTE* repMatch2 = repIndex2 < prefixLowestIndex ? dictBase - dictIndexDelta + repIndex2 : base + repIndex2; if ( ((U32)((prefixLowestIndex-1) - (U32)repIndex2) >= 3 /* intentional overflow */)