fixed: tree not updated after finding very long rep matches
diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c
index 56c6360..a496317 100644
--- a/lib/compress/zstd_compress.c
+++ b/lib/compress/zstd_compress.c
@@ -2205,8 +2205,13 @@
static size_t ZSTD_compressBlock_internal(ZSTD_CCtx* zc, void* dst, size_t dstCapacity, const void* src, size_t srcSize)
{
ZSTD_blockCompressor const blockCompressor = ZSTD_selectBlockCompressor(zc->params.cParams.strategy, zc->lowLimit < zc->dictLimit);
+ const BYTE* const base = zc->base;
+ const BYTE* const istart = (const BYTE*)src;
+ const U32 current = (U32)(istart-base);
if (srcSize < MIN_CBLOCK_SIZE+ZSTD_blockHeaderSize+1) return 0; /* don't even attempt compression below a certain srcSize */
ZSTD_resetSeqStore(&(zc->seqStore));
+ if (current > zc->nextToUpdate + 384)
+ zc->nextToUpdate = current - MIN(192, (U32)(current - zc->nextToUpdate - 384)); /* update tree not updated after finding very long rep matches */
blockCompressor(zc, src, srcSize);
return ZSTD_compressSequences(zc, dst, dstCapacity, srcSize);
}
diff --git a/lib/compress/zstd_opt.h b/lib/compress/zstd_opt.h
index d9f6cfd..f30cdbf 100644
--- a/lib/compress/zstd_opt.h
+++ b/lib/compress/zstd_opt.h
@@ -674,8 +674,8 @@
#if ZSTD_OPT_DEBUG >= 5
U32 ml2;
- if (offset > ZSTD_REP_MOVE_OPT)
- ml2 = (U32)ZSTD_count(ip, ip-(offset-ZSTD_REP_MOVE_OPT), iend);
+ if (offset+1 > ZSTD_REP_MOVE_OPT)
+ ml2 = (U32)ZSTD_count(ip, ip-(offset+1-ZSTD_REP_MOVE_OPT), iend);
else
ml2 = (U32)ZSTD_count(ip, ip-rep[0], iend);
if ((offset >= 8) && (ml2 < mlen || ml2 < minMatch)) {
@@ -992,8 +992,8 @@
#if ZSTD_OPT_DEBUG >= 5
U32 ml2;
- if (offset > ZSTD_REP_MOVE_OPT) {
- best_off = offset - ZSTD_REP_MOVE_OPT;
+ if (offset+1 > ZSTD_REP_MOVE_OPT) {
+ best_off = offset+1 - ZSTD_REP_MOVE_OPT;
if (best_off > (size_t)(ip - prefixStart)) {
const BYTE* match = dictEnd - (best_off - (ip - prefixStart));
ml2 = ZSTD_count_2segments(ip, match, iend, dictEnd, prefixStart);