From: Yann Collet Date: Thu, 25 Aug 2016 20:24:59 +0000 (+0200) Subject: reinforced fix for huge files X-Git-Tag: v1.0.0^2~28 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5a02b69215eee38ce669fc9a9907417cce38e347;p=thirdparty%2Fzstd.git reinforced fix for huge files --- diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index 0a2fb9afa..64bb7d403 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -2248,6 +2248,7 @@ static size_t ZSTD_compressBlock_internal(ZSTD_CCtx* zc, void* dst, size_t dstCa * Frame is supposed already started (header already produced) * @return : compressed size, or an error code */ +#include static size_t ZSTD_compress_generic (ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize, @@ -2274,8 +2275,10 @@ static size_t ZSTD_compress_generic (ZSTD_CCtx* cctx, if (cctx->lowLimit > (1<<30)) { U32 const btplus = (cctx->params.cParams.strategy == ZSTD_btlazy2) | (cctx->params.cParams.strategy == ZSTD_btopt); U32 const chainMask = (1 << (cctx->params.cParams.chainLog - btplus)) - 1; - U32 const newLowLimit = (cctx->lowLimit & chainMask) + (chainMask+1); /* preserve position % chainSize, ensure current-repcode doesn't underflow */ + U32 const supLog = MAX(cctx->params.cParams.chainLog, 17 /* blockSize */); + U32 const newLowLimit = (cctx->lowLimit & chainMask) + (1 << supLog); /* preserve position % chainSize, ensure current-repcode doesn't underflow */ U32 const correction = cctx->lowLimit - newLowLimit; + fprintf(stderr, "chainMask : %u \n", chainMask); ZSTD_reduceIndex(cctx, correction); cctx->base += correction; cctx->dictBase += correction;