]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
fix 32-bits windows decoding on high-compression archives
authorYann Collet <yann.collet.73@gmail.com>
Thu, 10 Dec 2015 23:27:41 +0000 (00:27 +0100)
committerYann Collet <yann.collet.73@gmail.com>
Thu, 10 Dec 2015 23:27:41 +0000 (00:27 +0100)
lib/zstd_decompress.c

index d1e01c3e587fe36f8d727ddec642a7cab5821396..e1c30a8d6f57ea5b35c1570e253a427a9ab46b1e 100644 (file)
@@ -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;