[lib] Fix assertion when dictionary is prefix
This commit is contained in:
1 parent
3c1eba4d99
commit
f800e72a3c
4 files changed
+11
-1
No files matched your search
@@ -66,6 +66,7 @@ void ZSTD_copyDDictParameters(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict)
|
|||||||
dctx->dictEnd = (const BYTE*)ddict->dictContent + ddict->dictSize;
|
dctx->dictEnd = (const BYTE*)ddict->dictContent + ddict->dictSize;
|
||||||
dctx->previousDstEnd = dctx->dictEnd;
|
dctx->previousDstEnd = dctx->dictEnd;
|
||||||
#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
|
#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
|
||||||
|
dctx->dictContentBeginForFuzzing = dctx->prefixStart;
|
||||||
dctx->dictContentEndForFuzzing = dctx->previousDstEnd;
|
dctx->dictContentEndForFuzzing = dctx->previousDstEnd;
|
||||||
#endif
|
#endif
|
||||||
if (ddict->entropyPresent) {
|
if (ddict->entropyPresent) {
|
||||||
|
|||||||
@@ -1043,6 +1043,7 @@ static size_t ZSTD_refDictContent(ZSTD_DCtx* dctx, const void* dict, size_t dict
|
|||||||
dctx->prefixStart = dict;
|
dctx->prefixStart = dict;
|
||||||
dctx->previousDstEnd = (const char*)dict + dictSize;
|
dctx->previousDstEnd = (const char*)dict + dictSize;
|
||||||
#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
|
#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
|
||||||
|
dctx->dictContentBeginForFuzzing = dctx->prefixStart;
|
||||||
dctx->dictContentEndForFuzzing = dctx->previousDstEnd;
|
dctx->dictContentEndForFuzzing = dctx->previousDstEnd;
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -953,6 +953,8 @@ static int ZSTD_dictionaryIsActive(ZSTD_DCtx const* dctx, BYTE const* prefixStar
|
|||||||
size_t const windowSize = dctx->fParams.windowSize;
|
size_t const windowSize = dctx->fParams.windowSize;
|
||||||
/* No dictionary used. */
|
/* No dictionary used. */
|
||||||
if (dctx->dictContentEndForFuzzing == NULL) return 0;
|
if (dctx->dictContentEndForFuzzing == NULL) return 0;
|
||||||
|
/* Dictionary is our prefix. */
|
||||||
|
if (prefixStart == dctx->dictContentBeginForFuzzing) return 1;
|
||||||
/* Dictionary is not our ext-dict. */
|
/* Dictionary is not our ext-dict. */
|
||||||
if (dctx->dictEnd != dctx->dictContentEndForFuzzing) return 0;
|
if (dctx->dictEnd != dctx->dictContentEndForFuzzing) return 0;
|
||||||
/* Dictionary is not within our window size. */
|
/* Dictionary is not within our window size. */
|
||||||
@@ -970,11 +972,13 @@ MEM_STATIC void ZSTD_assertValidSequence(
|
|||||||
size_t const windowSize = dctx->fParams.windowSize;
|
size_t const windowSize = dctx->fParams.windowSize;
|
||||||
size_t const sequenceSize = seq.litLength + seq.matchLength;
|
size_t const sequenceSize = seq.litLength + seq.matchLength;
|
||||||
BYTE const* const oLitEnd = op + seq.litLength;
|
BYTE const* const oLitEnd = op + seq.litLength;
|
||||||
|
DEBUGLOG(6, "Checking sequence: litL=%u matchL=%u offset=%u",
|
||||||
|
(U32)seq.litLength, (U32)seq.matchLength, (U32)seq.offset);
|
||||||
assert(op <= oend);
|
assert(op <= oend);
|
||||||
assert((size_t)(oend - op) >= sequenceSize);
|
assert((size_t)(oend - op) >= sequenceSize);
|
||||||
assert(sequenceSize <= ZSTD_BLOCKSIZE_MAX);
|
assert(sequenceSize <= ZSTD_BLOCKSIZE_MAX);
|
||||||
if (ZSTD_dictionaryIsActive(dctx, prefixStart, oLitEnd)) {
|
if (ZSTD_dictionaryIsActive(dctx, prefixStart, oLitEnd)) {
|
||||||
size_t const dictSize = (size_t)(prefixStart - virtualStart);
|
size_t const dictSize = (size_t)((char const*)dctx->dictContentEndForFuzzing - (char const*)dctx->dictContentBeginForFuzzing);
|
||||||
/* Offset must be within the dictionary. */
|
/* Offset must be within the dictionary. */
|
||||||
assert(seq.offset <= (size_t)(oLitEnd - virtualStart));
|
assert(seq.offset <= (size_t)(oLitEnd - virtualStart));
|
||||||
assert(seq.offset <= windowSize + dictSize);
|
assert(seq.offset <= windowSize + dictSize);
|
||||||
@@ -1071,6 +1075,7 @@ ZSTD_decompressSequences_body( ZSTD_DCtx* dctx,
|
|||||||
seq_t const sequence = ZSTD_decodeSequence(&seqState, isLongOffset, ZSTD_p_noPrefetch);
|
seq_t const sequence = ZSTD_decodeSequence(&seqState, isLongOffset, ZSTD_p_noPrefetch);
|
||||||
size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litEnd, prefixStart, vBase, dictEnd);
|
size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litEnd, prefixStart, vBase, dictEnd);
|
||||||
#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE)
|
#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE)
|
||||||
|
assert(!ZSTD_isError(oneSeqSize));
|
||||||
if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequence, prefixStart, vBase);
|
if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequence, prefixStart, vBase);
|
||||||
#endif
|
#endif
|
||||||
DEBUGLOG(6, "regenerated sequence size : %u", (U32)oneSeqSize);
|
DEBUGLOG(6, "regenerated sequence size : %u", (U32)oneSeqSize);
|
||||||
@@ -1174,6 +1179,7 @@ ZSTD_decompressSequencesLong_body(
|
|||||||
seq_t const sequence = ZSTD_decodeSequence(&seqState, isLongOffset, ZSTD_p_prefetch);
|
seq_t const sequence = ZSTD_decodeSequence(&seqState, isLongOffset, ZSTD_p_prefetch);
|
||||||
size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequences[(seqNb-ADVANCED_SEQS) & STORED_SEQS_MASK], &litPtr, litEnd, prefixStart, dictStart, dictEnd);
|
size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequences[(seqNb-ADVANCED_SEQS) & STORED_SEQS_MASK], &litPtr, litEnd, prefixStart, dictStart, dictEnd);
|
||||||
#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE)
|
#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE)
|
||||||
|
assert(!ZSTD_isError(oneSeqSize));
|
||||||
if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequences[(seqNb-ADVANCED_SEQS) & STORED_SEQS_MASK], prefixStart, dictStart);
|
if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequences[(seqNb-ADVANCED_SEQS) & STORED_SEQS_MASK], prefixStart, dictStart);
|
||||||
#endif
|
#endif
|
||||||
if (ZSTD_isError(oneSeqSize)) return oneSeqSize;
|
if (ZSTD_isError(oneSeqSize)) return oneSeqSize;
|
||||||
@@ -1188,6 +1194,7 @@ ZSTD_decompressSequencesLong_body(
|
|||||||
for ( ; seqNb<nbSeq ; seqNb++) {
|
for ( ; seqNb<nbSeq ; seqNb++) {
|
||||||
size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequences[seqNb&STORED_SEQS_MASK], &litPtr, litEnd, prefixStart, dictStart, dictEnd);
|
size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequences[seqNb&STORED_SEQS_MASK], &litPtr, litEnd, prefixStart, dictStart, dictEnd);
|
||||||
#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE)
|
#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE)
|
||||||
|
assert(!ZSTD_isError(oneSeqSize));
|
||||||
if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequences[seqNb&STORED_SEQS_MASK], prefixStart, dictStart);
|
if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequences[seqNb&STORED_SEQS_MASK], prefixStart, dictStart);
|
||||||
#endif
|
#endif
|
||||||
if (ZSTD_isError(oneSeqSize)) return oneSeqSize;
|
if (ZSTD_isError(oneSeqSize)) return oneSeqSize;
|
||||||
|
|||||||
@@ -162,6 +162,7 @@ struct ZSTD_DCtx_s
|
|||||||
size_t oversizedDuration;
|
size_t oversizedDuration;
|
||||||
|
|
||||||
#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
|
#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
|
||||||
|
void const* dictContentBeginForFuzzing;
|
||||||
void const* dictContentEndForFuzzing;
|
void const* dictContentEndForFuzzing;
|
||||||
#endif
|
#endif
|
||||||
}; /* typedef'd to ZSTD_DCtx within "zstd.h" */
|
}; /* typedef'd to ZSTD_DCtx within "zstd.h" */
|
||||||
|
|||||||
Reference in new issue
Block a user