diff options
author | Yann Collet <cyan@fb.com> | 2020-09-28 05:47:05 (GMT) |
---|---|---|
committer | Yann Collet <cyan@fb.com> | 2020-09-28 05:47:05 (GMT) |
commit | a13c79d56dacc0a21a95f3420737e5d3f5b61cf8 (patch) | |
tree | 75ceeed734fa20f1ec0719f00d84ff07698eebd1 | |
parent | e7fe105ac6ed02019d34731d2ba3aceb11b51bb1 (diff) | |
download | lz4-a13c79d56dacc0a21a95f3420737e5d3f5b61cf8.zip lz4-a13c79d56dacc0a21a95f3420737e5d3f5b61cf8.tar.gz lz4-a13c79d56dacc0a21a95f3420737e5d3f5b61cf8.tar.bz2 |
fix incorrect counting
after truncation of last sequence
-rw-r--r-- | lib/lz4hc.c | 5 | ||||
-rw-r--r-- | tests/fuzzer.c | 2 |
2 files changed, 4 insertions, 3 deletions
diff --git a/lib/lz4hc.c b/lib/lz4hc.c index aefc95b..7c7b990 100644 --- a/lib/lz4hc.c +++ b/lib/lz4hc.c @@ -481,7 +481,7 @@ LZ4_FORCE_INLINE int LZ4HC_encodeSequence ( U32 const cost = 1 + llAdd + ll + 2 + mlAdd; if (start==NULL) start = *anchor; /* only works for single segment */ /* g_debuglog_enable = (pos >= 2228) & (pos <= 2262); */ - DEBUGLOG(6, "pos:%7u -- literals:%3u, match:%4i, offset:%5u, cost:%3u + %u", + DEBUGLOG(6, "pos:%7u -- literals:%4u, match:%4i, offset:%5u, cost:%4u + %5u", pos, (U32)(*ip - *anchor), matchLength, (U32)(*ip-match), cost, totalCost); @@ -726,7 +726,7 @@ _last_literals: lastRunSize -= llAdd; } DEBUGLOG(6, "Final literal run : %i literals", (int)lastRunSize); - ip = ip + lastRunSize; /* can be != iend if limit==fillOutput */ + ip = anchor + lastRunSize; /* can be != iend if limit==fillOutput */ if (lastRunSize >= RUN_MASK) { size_t accumulator = lastRunSize - RUN_MASK; @@ -751,6 +751,7 @@ _dest_overflow: size_t const ll_addbytes = (ll + 240) / 255; size_t const ll_totalCost = 1 + ll_addbytes + ll; BYTE* const maxLitPos = oend - 3; /* 2 for offset, 1 for token */ + DEBUGLOG(6, "Last sequence overflowing"); op = optr; /* restore correct out pointer */ if (op + ll_totalCost <= maxLitPos) { /* ll validated; now how many matches ? */ diff --git a/tests/fuzzer.c b/tests/fuzzer.c index e611bb4..ef9577d 100644 --- a/tests/fuzzer.c +++ b/tests/fuzzer.c @@ -447,7 +447,7 @@ static int FUZ_test(U32 seed, U32 nbCycles, const U32 startCycle, const double c decodedBuffer[srcSize] = canary; { int const dSize = LZ4_decompress_safe(compressedBuffer, decodedBuffer, cSize, srcSize); FUZ_CHECKTEST(dSize<0, "LZ4_decompress_safe() failed on data compressed by LZ4_compressHC_destSize"); - FUZ_CHECKTEST(dSize!=srcSize, "LZ4_decompress_safe() failed : did not fully decompressed data"); + FUZ_CHECKTEST(dSize!=srcSize, "LZ4_decompress_safe() failed : decompressed %i bytes, was supposed to decompress %i bytes", dSize, srcSize); } FUZ_CHECKTEST(decodedBuffer[srcSize] != canary, "LZ4_decompress_safe() overwrite dst buffer !"); { U32 const crcDec = XXH32(decodedBuffer, (size_t)srcSize, 0); |