Fix undefined behaviour in decompressor
This commit is contained in:
parent
a067c38eea
commit
8fe5c6862c
@ -48,14 +48,15 @@ MEM_STATIC void MEM_check(void) { MEM_STATIC_ASSERT((sizeof(size_t)==4) || (size
|
|||||||
*****************************************************************/
|
*****************************************************************/
|
||||||
#if !defined (__VMS) && (defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) )
|
#if !defined (__VMS) && (defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) )
|
||||||
# include <stdint.h>
|
# include <stdint.h>
|
||||||
typedef uint8_t BYTE;
|
typedef uint8_t BYTE;
|
||||||
typedef uint16_t U16;
|
typedef uint16_t U16;
|
||||||
typedef int16_t S16;
|
typedef int16_t S16;
|
||||||
typedef uint32_t U32;
|
typedef uint32_t U32;
|
||||||
typedef int32_t S32;
|
typedef int32_t S32;
|
||||||
typedef uint64_t U64;
|
typedef uint64_t U64;
|
||||||
typedef int64_t S64;
|
typedef int64_t S64;
|
||||||
typedef intptr_t iPtrDiff;
|
typedef intptr_t iPtrDiff;
|
||||||
|
typedef uintptr_t uPtrDiff;
|
||||||
#else
|
#else
|
||||||
typedef unsigned char BYTE;
|
typedef unsigned char BYTE;
|
||||||
typedef unsigned short U16;
|
typedef unsigned short U16;
|
||||||
@ -65,6 +66,7 @@ MEM_STATIC void MEM_check(void) { MEM_STATIC_ASSERT((sizeof(size_t)==4) || (size
|
|||||||
typedef unsigned long long U64;
|
typedef unsigned long long U64;
|
||||||
typedef signed long long S64;
|
typedef signed long long S64;
|
||||||
typedef ptrdiff_t iPtrDiff;
|
typedef ptrdiff_t iPtrDiff;
|
||||||
|
typedef size_t uPtrDiff;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
@ -1033,7 +1033,7 @@ size_t ZSTD_execSequence(BYTE* op,
|
|||||||
if (sequence.offset > (size_t)(oLitEnd - base)) {
|
if (sequence.offset > (size_t)(oLitEnd - base)) {
|
||||||
/* offset beyond prefix */
|
/* offset beyond prefix */
|
||||||
if (sequence.offset > (size_t)(oLitEnd - vBase)) return ERROR(corruption_detected);
|
if (sequence.offset > (size_t)(oLitEnd - vBase)) return ERROR(corruption_detected);
|
||||||
match += (dictEnd-base);
|
match = dictEnd + (match - base);
|
||||||
if (match + sequence.matchLength <= dictEnd) {
|
if (match + sequence.matchLength <= dictEnd) {
|
||||||
memmove(oLitEnd, match, sequence.matchLength);
|
memmove(oLitEnd, match, sequence.matchLength);
|
||||||
return sequenceLength;
|
return sequenceLength;
|
||||||
@ -1216,7 +1216,7 @@ FORCE_INLINE seq_t ZSTD_decodeSequenceLong_generic(seqState_t* seqState, int con
|
|||||||
|
|
||||||
{ size_t const pos = seqState->pos + seq.litLength;
|
{ size_t const pos = seqState->pos + seq.litLength;
|
||||||
seq.match = seqState->base + pos - seq.offset; /* single memory segment */
|
seq.match = seqState->base + pos - seq.offset; /* single memory segment */
|
||||||
if (seq.offset > pos) seq.match += seqState->gotoDict; /* separate memory segment */
|
if (seq.offset > pos) seq.match += (uPtrDiff)seqState->gotoDict; /* separate memory segment */
|
||||||
seqState->pos = pos + seq.matchLength;
|
seqState->pos = pos + seq.matchLength;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1356,7 +1356,7 @@ static size_t ZSTD_decompressSequencesLong(
|
|||||||
{ U32 i; for (i=0; i<ZSTD_REP_NUM; i++) seqState.prevOffset[i] = dctx->entropy.rep[i]; }
|
{ U32 i; for (i=0; i<ZSTD_REP_NUM; i++) seqState.prevOffset[i] = dctx->entropy.rep[i]; }
|
||||||
seqState.base = base;
|
seqState.base = base;
|
||||||
seqState.pos = (size_t)(op-base);
|
seqState.pos = (size_t)(op-base);
|
||||||
seqState.gotoDict = (iPtrDiff)(dictEnd - base);
|
seqState.gotoDict = (iPtrDiff)((uPtrDiff)dictEnd - (uPtrDiff)base); /* cast to avoid undefined behaviour */
|
||||||
CHECK_E(BIT_initDStream(&seqState.DStream, ip, iend-ip), corruption_detected);
|
CHECK_E(BIT_initDStream(&seqState.DStream, ip, iend-ip), corruption_detected);
|
||||||
FSE_initDState(&seqState.stateLL, &seqState.DStream, dctx->LLTptr);
|
FSE_initDState(&seqState.stateLL, &seqState.DStream, dctx->LLTptr);
|
||||||
FSE_initDState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr);
|
FSE_initDState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr);
|
||||||
|
Loading…
Reference in New Issue
Block a user