From: Yann Collet Date: Thu, 10 Dec 2015 23:27:41 +0000 (+0100) Subject: fix 32-bits windows decoding on high-compression archives X-Git-Tag: v0.4.4^2~8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9f5ab1a4f5d735b93f8ab881808a863d7f147ce8;p=thirdparty%2Fzstd.git fix 32-bits windows decoding on high-compression archives --- diff --git a/lib/zstd_decompress.c b/lib/zstd_decompress.c index d1e01c3e5..e1c30a8d6 100644 --- a/lib/zstd_decompress.c +++ b/lib/zstd_decompress.c @@ -527,14 +527,11 @@ FORCE_INLINE size_t ZSTD_execSequence(BYTE* op, *litPtr = litEnd; /* update for next sequence */ /* copy Match */ - /* check */ - //if (match > oLitEnd) return ERROR(corruption_detected); /* address space overflow test (is clang optimizer wrongly removing this test ?) */ - if (sequence.offset > (size_t)oLitEnd) return ERROR(corruption_detected); /* address space overflow test (this test seems preserved by clang optimizer) */ - - if (match < base) + if (sequence.offset > (size_t)(oLitEnd - base)) { /* offset beyond prefix */ - if (match < vBase) return ERROR(corruption_detected); + if (sequence.offset > (size_t)(oLitEnd - vBase)) + return ERROR(corruption_detected); match = dictEnd - (base-match); if (match + sequence.matchLength <= dictEnd) { @@ -773,8 +770,6 @@ size_t ZSTD_decompressContinue(ZSTD_DCtx* ctx, void* dst, size_t maxDstSize, con if (srcSize != ctx->expected) return ERROR(srcSize_wrong); if (dst != ctx->previousDstEnd) /* not contiguous */ { - if ((dst > ctx->base) && (dst < ctx->previousDstEnd)) /* rolling buffer : new segment into dictionary */ - ctx->base = (char*)dst; /* temporary affectation, for vBase calculation */ ctx->dictEnd = ctx->previousDstEnd; ctx->vBase = (const char*)dst - ((const char*)(ctx->previousDstEnd) - (const char*)(ctx->base)); ctx->base = dst;