Merge pull request #1598 from terrelln/decode-seq
[libzstd] Error if all sequence bits aren't consumed
This commit is contained in:
@@ -918,6 +918,11 @@ ZSTD_decompressSequences_body( ZSTD_DCtx* dctx,
|
|||||||
ZSTD_initFseState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr);
|
ZSTD_initFseState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr);
|
||||||
ZSTD_initFseState(&seqState.stateML, &seqState.DStream, dctx->MLTptr);
|
ZSTD_initFseState(&seqState.stateML, &seqState.DStream, dctx->MLTptr);
|
||||||
|
|
||||||
|
ZSTD_STATIC_ASSERT(
|
||||||
|
BIT_DStream_unfinished < BIT_DStream_completed &&
|
||||||
|
BIT_DStream_endOfBuffer < BIT_DStream_completed &&
|
||||||
|
BIT_DStream_completed < BIT_DStream_overflow);
|
||||||
|
|
||||||
for ( ; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && nbSeq ; ) {
|
for ( ; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && nbSeq ; ) {
|
||||||
nbSeq--;
|
nbSeq--;
|
||||||
{ seq_t const sequence = ZSTD_decodeSequence(&seqState, isLongOffset);
|
{ seq_t const sequence = ZSTD_decodeSequence(&seqState, isLongOffset);
|
||||||
@@ -930,6 +935,7 @@ ZSTD_decompressSequences_body( ZSTD_DCtx* dctx,
|
|||||||
/* check if reached exact end */
|
/* check if reached exact end */
|
||||||
DEBUGLOG(5, "ZSTD_decompressSequences_body: after decode loop, remaining nbSeq : %i", nbSeq);
|
DEBUGLOG(5, "ZSTD_decompressSequences_body: after decode loop, remaining nbSeq : %i", nbSeq);
|
||||||
RETURN_ERROR_IF(nbSeq, corruption_detected);
|
RETURN_ERROR_IF(nbSeq, corruption_detected);
|
||||||
|
RETURN_ERROR_IF(BIT_reloadDStream(&seqState.DStream) < BIT_DStream_completed, corruption_detected);
|
||||||
/* save reps for next block */
|
/* save reps for next block */
|
||||||
{ U32 i; for (i=0; i<ZSTD_REP_NUM; i++) dctx->entropy.rep[i] = (U32)(seqState.prevOffset[i]); }
|
{ U32 i; for (i=0; i<ZSTD_REP_NUM; i++) dctx->entropy.rep[i] = (U32)(seqState.prevOffset[i]); }
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user