mirror of
https://github.com/facebook/zstd.git
synced 2025-03-07 09:26:03 +02:00
fix bound check for ZSTD_copySequencesToSeqStoreNoBlockDelim()
This commit is contained in:
parent
0a91b31b17
commit
7d600c628a
@ -6327,7 +6327,6 @@ ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_sequencePosition*
|
|||||||
/* Move to the next sequence */
|
/* Move to the next sequence */
|
||||||
endPosInSequence -= currSeq.litLength + currSeq.matchLength;
|
endPosInSequence -= currSeq.litLength + currSeq.matchLength;
|
||||||
startPosInSequence = 0;
|
startPosInSequence = 0;
|
||||||
idx++;
|
|
||||||
} else {
|
} else {
|
||||||
/* This is the final (partial) sequence we're adding from inSeqs, and endPosInSequence
|
/* This is the final (partial) sequence we're adding from inSeqs, and endPosInSequence
|
||||||
does not reach the end of the match. So, we have to split the sequence */
|
does not reach the end of the match. So, we have to split the sequence */
|
||||||
@ -6382,6 +6381,8 @@ ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_sequencePosition*
|
|||||||
"Not enough memory allocated. Try adjusting ZSTD_c_minMatch.");
|
"Not enough memory allocated. Try adjusting ZSTD_c_minMatch.");
|
||||||
ZSTD_storeSeq(&cctx->seqStore, litLength, ip, iend, offBase, matchLength);
|
ZSTD_storeSeq(&cctx->seqStore, litLength, ip, iend, offBase, matchLength);
|
||||||
ip += matchLength + litLength;
|
ip += matchLength + litLength;
|
||||||
|
if (!finalMatchSplit)
|
||||||
|
idx++; /* Next Sequence */
|
||||||
}
|
}
|
||||||
DEBUGLOG(5, "Ending seq: idx: %u (of: %u ml: %u ll: %u)", idx, inSeqs[idx].offset, inSeqs[idx].matchLength, inSeqs[idx].litLength);
|
DEBUGLOG(5, "Ending seq: idx: %u (of: %u ml: %u ll: %u)", idx, inSeqs[idx].offset, inSeqs[idx].matchLength, inSeqs[idx].litLength);
|
||||||
assert(idx == inSeqsSize || endPosInSequence <= inSeqs[idx].litLength + inSeqs[idx].matchLength);
|
assert(idx == inSeqsSize || endPosInSequence <= inSeqs[idx].litLength + inSeqs[idx].matchLength);
|
||||||
|
@ -41,8 +41,6 @@ static ZSTD_DDict* ddict = NULL;
|
|||||||
#define ZSTD_FUZZ_MATCHLENGTH_MAXSIZE (1 << 18) /* Allow up to 256KB matches */
|
#define ZSTD_FUZZ_MATCHLENGTH_MAXSIZE (1 << 18) /* Allow up to 256KB matches */
|
||||||
#define ZSTD_FUZZ_GENERATED_DICT_MAXSIZE (1 << ZSTD_WINDOWLOG_MAX_32) /* Allow up to 1 << ZSTD_WINDOWLOG_MAX_32 dictionary */
|
#define ZSTD_FUZZ_GENERATED_DICT_MAXSIZE (1 << ZSTD_WINDOWLOG_MAX_32) /* Allow up to 1 << ZSTD_WINDOWLOG_MAX_32 dictionary */
|
||||||
#define ZSTD_FUZZ_MAX_NBSEQ (1 << 17) /* Maximum of 128K sequences */
|
#define ZSTD_FUZZ_MAX_NBSEQ (1 << 17) /* Maximum of 128K sequences */
|
||||||
#define ZSTD_FUZZ_DICT_FILE "sequence_fuzz_dictionary"
|
|
||||||
|
|
||||||
|
|
||||||
/* Deterministic random number generator */
|
/* Deterministic random number generator */
|
||||||
#define FUZZ_RDG_rotl32(x,r) ((x << r) | (x >> (32 - r)))
|
#define FUZZ_RDG_rotl32(x,r) ((x << r) | (x >> (32 - r)))
|
||||||
|
@ -2139,6 +2139,40 @@ static int basicUnitTests(U32 seed, double compressibility, int bigTests)
|
|||||||
|
|
||||||
ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters);
|
ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters);
|
||||||
|
|
||||||
|
|
||||||
|
/* Test with no block delim */
|
||||||
|
{
|
||||||
|
size_t srcSize = 4;
|
||||||
|
void* const src = CNBuffer;
|
||||||
|
size_t dstSize = ZSTD_compressBound(srcSize);
|
||||||
|
void* const dst = compressedBuffer;
|
||||||
|
size_t const kNbSequences = 1;
|
||||||
|
ZSTD_Sequence* sequences = malloc(sizeof(ZSTD_Sequence) * kNbSequences);
|
||||||
|
void* const checkBuf = malloc(srcSize);
|
||||||
|
|
||||||
|
memset(src, 'x', srcSize);
|
||||||
|
|
||||||
|
sequences[0] = (ZSTD_Sequence) {1, 1, 3, 0};
|
||||||
|
|
||||||
|
/* Test with sequence validation */
|
||||||
|
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_minMatch, 3));
|
||||||
|
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_blockDelimiters, ZSTD_sf_noBlockDelimiters));
|
||||||
|
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_validateSequences, 1));
|
||||||
|
|
||||||
|
cSize = ZSTD_compressSequences(cctx, dst, dstSize,
|
||||||
|
sequences, kNbSequences,
|
||||||
|
src, srcSize);
|
||||||
|
|
||||||
|
CHECK(ZSTD_isError(cSize), "Should not throw an error");
|
||||||
|
CHECK_Z(ZSTD_decompress(checkBuf, srcSize, dst, cSize));
|
||||||
|
CHECK(memcmp(src, checkBuf, srcSize) != 0, "Corruption!");
|
||||||
|
|
||||||
|
free(sequences);
|
||||||
|
free(checkBuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters);
|
||||||
|
|
||||||
{ /* Test case with two additional sequences */
|
{ /* Test case with two additional sequences */
|
||||||
size_t srcSize = 19;
|
size_t srcSize = 19;
|
||||||
void* const src = CNBuffer;
|
void* const src = CNBuffer;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user