diff options
author | Yann Collet <cyan@fb.com> | 2018-09-05 01:21:40 (GMT) |
---|---|---|
committer | Yann Collet <cyan@fb.com> | 2018-09-05 01:21:40 (GMT) |
commit | 2e4847c2d55fb4c4f5dc833e61b5f374da8407e6 (patch) | |
tree | a596da5254cfdb5b726db9e46fa72379d6c69d35 | |
parent | 943fa6244a3985541bc93250d35ea4f4517fb266 (diff) | |
download | lz4-2e4847c2d55fb4c4f5dc833e61b5f374da8407e6.zip lz4-2e4847c2d55fb4c4f5dc833e61b5f374da8407e6.tar.gz lz4-2e4847c2d55fb4c4f5dc833e61b5f374da8407e6.tar.bz2 |
fixed #560
it was a fairly complex scenario,
involving source files > 64K
and some extraordinary conditions related to specific layout of ranges of zeroes.
and only on level 9.
-rw-r--r-- | lib/lz4hc.c | 4 | ||||
-rw-r--r-- | programs/bench.c | 2 |
2 files changed, 5 insertions, 1 deletions
diff --git a/lib/lz4hc.c b/lib/lz4hc.c index 8108ea0..236dc5b 100644 --- a/lib/lz4hc.c +++ b/lib/lz4hc.c @@ -327,6 +327,8 @@ LZ4HC_InsertAndGetWiderMatch ( if (lookBackLength==0) { /* no back possible */ size_t const maxML = MIN(currentSegmentLength, srcPatternLength); if ((size_t)longest < maxML) { + assert(base + matchIndex < ip); + if (ip - (base+matchIndex) > MAX_DISTANCE) break; assert(maxML < 2 GB); longest = (int)maxML; *matchpos = base + matchIndex; /* virtual pos, relative to ip, to retrieve offset */ @@ -450,6 +452,8 @@ LZ4_FORCE_INLINE int LZ4HC_encodeSequence ( *op += length; /* Encode Offset */ + assert(*ip > match); + assert( (*ip - match) <= MAX_DISTANCE ); LZ4_writeLE16(*op, (U16)(*ip-match)); *op += 2; /* Encode MatchLength */ diff --git a/programs/bench.c b/programs/bench.c index 9dc31c4..11bf044 100644 --- a/programs/bench.c +++ b/programs/bench.c @@ -329,7 +329,7 @@ static int BMK_benchMem(const void* srcBuffer, size_t srcSize, { U64 const crcCheck = XXH64(resultBuffer, srcSize, 0); if (crcOrig!=crcCheck) { size_t u; - DISPLAY("!!! WARNING !!! %14s : Invalid Checksum : %x != %x \n", displayName, (unsigned)crcOrig, (unsigned)crcCheck); + DISPLAY("\n!!! WARNING !!! %17s : Invalid Checksum : %x != %x \n", displayName, (unsigned)crcOrig, (unsigned)crcCheck); for (u=0; u<srcSize; u++) { if (((const BYTE*)srcBuffer)[u] != ((const BYTE*)resultBuffer)[u]) { U32 segNb, bNb, pos; |