Fix CDict Attachment to Handle CDicts with Non-Zero Starts

CDicts were previously guaranteed to be generated with `lowLimit=dictLimit=0`.
This is no longer true, and so the old length and index calculations are no
longer valid. This diff fixes them to handle non-zero start indices in CDicts.
dev
W. Felix Handte 2018-08-07 17:05:05 -07:00
parent 5808027abf
commit 2ca7c69167
1 changed files with 4 additions and 3 deletions

View File

@ -1284,8 +1284,9 @@ static size_t ZSTD_resetCCtx_usingCDict(ZSTD_CCtx* cctx,
} }
if (attachDict) { if (attachDict) {
const U32 cdictLen = (U32)( cdict->matchState.window.nextSrc const U32 cdictEnd = (U32)( cdict->matchState.window.nextSrc
- cdict->matchState.window.base); - cdict->matchState.window.base);
const U32 cdictLen = cdictEnd - cdict->matchState.window.dictLimit;
if (cdictLen == 0) { if (cdictLen == 0) {
/* don't even attach dictionaries with no contents */ /* don't even attach dictionaries with no contents */
DEBUGLOG(4, "skipping attaching empty dictionary"); DEBUGLOG(4, "skipping attaching empty dictionary");
@ -1295,9 +1296,9 @@ static size_t ZSTD_resetCCtx_usingCDict(ZSTD_CCtx* cctx,
/* prep working match state so dict matches never have negative indices /* prep working match state so dict matches never have negative indices
* when they are translated to the working context's index space. */ * when they are translated to the working context's index space. */
if (cctx->blockState.matchState.window.dictLimit < cdictLen) { if (cctx->blockState.matchState.window.dictLimit < cdictEnd) {
cctx->blockState.matchState.window.nextSrc = cctx->blockState.matchState.window.nextSrc =
cctx->blockState.matchState.window.base + cdictLen; cctx->blockState.matchState.window.base + cdictEnd;
ZSTD_window_clear(&cctx->blockState.matchState.window); ZSTD_window_clear(&cctx->blockState.matchState.window);
} }
cctx->blockState.matchState.loadedDictEnd = cctx->blockState.matchState.window.dictLimit; cctx->blockState.matchState.loadedDictEnd = cctx->blockState.matchState.window.dictLimit;