Don't Attach Empty Dict Contents

In weird corner cases, they produce unexpected results...
dev
W. Felix Handte 2018-05-15 17:23:16 -04:00
parent 9c92223468
commit 582b7f85ed
1 changed files with 17 additions and 12 deletions

View File

@ -1227,20 +1227,25 @@ static size_t ZSTD_resetCCtx_usingCDict(ZSTD_CCtx* cctx,
} }
if (attachDict) { if (attachDict) {
DEBUGLOG(4, "attaching dictionary into context"); if (cdict->matchState.window.nextSrc - cdict->matchState.window.base == 0) {
cctx->blockState.matchState.dictMatchState = &cdict->matchState; /* don't even attach dictionaries with no contents */
DEBUGLOG(4, "skipping attaching empty dictionary");
} else {
DEBUGLOG(4, "attaching dictionary into context");
cctx->blockState.matchState.dictMatchState = &cdict->matchState;
/* 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 < if (cctx->blockState.matchState.window.dictLimit <
(U32)(cdict->matchState.window.nextSrc - cdict->matchState.window.base)) { (U32)(cdict->matchState.window.nextSrc - cdict->matchState.window.base)) {
cctx->blockState.matchState.window.nextSrc = cctx->blockState.matchState.window.nextSrc =
cctx->blockState.matchState.window.base + cctx->blockState.matchState.window.base +
( cdict->matchState.window.nextSrc ( cdict->matchState.window.nextSrc
- cdict->matchState.window.base); - cdict->matchState.window.base);
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;
} else { } else {
DEBUGLOG(4, "copying dictionary into context"); DEBUGLOG(4, "copying dictionary into context");
/* copy tables */ /* copy tables */