]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
Fix lowLimit underflow in overflow correction
authorNick Terrell <nickrterrell@gmail.com>
Fri, 17 Jan 2020 20:05:53 +0000 (12:05 -0800)
committerNick Terrell <nickrterrell@gmail.com>
Fri, 17 Jan 2020 20:10:18 +0000 (12:10 -0800)
lib/compress/zstd_compress_internal.h
tests/playTests.sh

index c76189cc1480ab8edef865bd0e3935168e192ca7..243f0e075ee6026395aa4007e988749adb164d92 100644 (file)
@@ -745,7 +745,10 @@ MEM_STATIC U32 ZSTD_window_correctOverflow(ZSTD_window_t* window, U32 cycleLog,
      */
     U32 const cycleMask = (1U << cycleLog) - 1;
     U32 const current = (U32)((BYTE const*)src - window->base);
-    U32 const newCurrent = (current & cycleMask) + maxDist;
+    U32 const currentCycle0 = current & cycleMask;
+    /* Exclude zero so that newCurrent - maxDist >= 1. */
+    U32 const currentCycle1 = currentCycle0 == 0 ? (1U << cycleLog) : currentCycle0;
+    U32 const newCurrent = currentCycle1 + maxDist;
     U32 const correction = current - newCurrent;
     assert((maxDist & cycleMask) == 0);
     assert(current > newCurrent);
@@ -754,8 +757,17 @@ MEM_STATIC U32 ZSTD_window_correctOverflow(ZSTD_window_t* window, U32 cycleLog,
 
     window->base += correction;
     window->dictBase += correction;
-    window->lowLimit -= correction;
-    window->dictLimit -= correction;
+    if (window->lowLimit <= correction) window->lowLimit = 1;
+    else window->lowLimit -= correction;
+    if (window->dictLimit <= correction) window->dictLimit = 1;
+    else window->dictLimit -= correction;
+
+    /* Ensure we can still reference the full window. */
+    assert(newCurrent >= maxDist);
+    assert(newCurrent - maxDist >= 1);
+    /* Ensure that lowLimit and dictLimit didn't underflow. */
+    assert(window->lowLimit <= newCurrent);
+    assert(window->dictLimit <= newCurrent);
 
     DEBUGLOG(4, "Correction of 0x%x bytes to lowLimit=0x%x", correction,
              window->lowLimit);
index ffb455a8e152f2ab0677a6ad2f0e40cc23fba7d7..52cbf7d3e56832c7686b6fd43848c3edd5e374f3 100755 (executable)
@@ -1239,8 +1239,8 @@ roundTripTest -g18000017 -P88 17
 roundTripTest -g18000018 -P94 18
 roundTripTest -g18000019 -P96 19
 
-roundTripTest -g5000000000 -P99 1
-roundTripTest -g1700000000 -P0 "1 --zstd=strategy=6"   # ensure btlazy2 can survive an overflow rescale
+roundTripTest -g5000000000 -P99 "1 --zstd=wlog=27"
+roundTripTest -g3700000000 -P0 "1 --zstd=strategy=6,wlog=27"   # ensure btlazy2 can survive an overflow rescale
 
 fileRoundTripTest -g4193M -P99 1