[lib] Fix bug in loading LDM dictionary in MT mode

Exposed when loading a dictionary < LDM minMatch bytes in MT mode.

Test Plan:
```
CC=clang make -j zstreamtest MOREFLAGS="-O0 -fsanitize=address"
./zstreamtest -vv -i100000000 -t1 --newapi -s7065 -t3925297
```

TODO: Add an explicit test that loads a small dictionary in MT mode
This commit is contained in:
Nick Terrell 2020-05-14 11:50:48 -07:00
parent 0208eeccd6
commit add7ed2d4a
2 changed files with 8 additions and 6 deletions

View File

@ -2846,7 +2846,7 @@ static size_t ZSTD_loadDictionaryContent(ZSTD_matchState_t* ms,
ZSTD_overflowCorrectIfNeeded(ms, ws, params, ip, ichunk); ZSTD_overflowCorrectIfNeeded(ms, ws, params, ip, ichunk);
if (params->ldmParams.enableLdm && ls != NULL && srcSize >= params->ldmParams.minMatchLength) if (params->ldmParams.enableLdm && ls != NULL)
ZSTD_ldm_fillHashTable(ls, (const BYTE*)src, (const BYTE*)src + srcSize, &params->ldmParams); ZSTD_ldm_fillHashTable(ls, (const BYTE*)src, (const BYTE*)src + srcSize, &params->ldmParams);
switch(params->cParams.strategy) switch(params->cParams.strategy)

View File

@ -228,11 +228,13 @@ void ZSTD_ldm_fillHashTable(
ldmState_t* state, const BYTE* ip, ldmState_t* state, const BYTE* ip,
const BYTE* iend, ldmParams_t const* params) const BYTE* iend, ldmParams_t const* params)
{ {
U64 startingHash = ZSTD_rollingHash_compute(ip, params->minMatchLength); if ((size_t)(iend - ip) >= params->minMatchLength) {
ZSTD_ldm_fillLdmHashTable( U64 startingHash = ZSTD_rollingHash_compute(ip, params->minMatchLength);
state, startingHash, ip, iend - params->minMatchLength, state->window.base, ZSTD_ldm_fillLdmHashTable(
params->hashLog - params->bucketSizeLog, state, startingHash, ip, iend - params->minMatchLength, state->window.base,
*params); params->hashLog - params->bucketSizeLog,
*params);
}
} }