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
parent
5808027abf
commit
2ca7c69167
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue