summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorYann Collet <cyan@fb.com>2018-04-17 22:29:17 (GMT)
committerYann Collet <cyan@fb.com>2018-04-17 22:29:17 (GMT)
commit152064218361e5762fd67b5de425707fdc47095b (patch)
treea6b0bfe1b39ee9d2e26a199f6f990e375abe0eb1 /lib
parentce78d10c1f8afd13fbea0071c70d48c8744e43d2 (diff)
downloadlz4-152064218361e5762fd67b5de425707fdc47095b.zip
lz4-152064218361e5762fd67b5de425707fdc47095b.tar.gz
lz4-152064218361e5762fd67b5de425707fdc47095b.tar.bz2
fix matchIndex overflow
can happen with dictCtx
Diffstat (limited to 'lib')
-rw-r--r--lib/lz4.c16
1 files changed, 4 insertions, 12 deletions
diff --git a/lib/lz4.c b/lib/lz4.c
index b426545..c799596 100644
--- a/lib/lz4.c
+++ b/lib/lz4.c
@@ -758,9 +758,9 @@ LZ4_FORCE_INLINE int LZ4_compress_generic(
forwardH = LZ4_hashPosition(forwardIp, tableType);
LZ4_putIndexOnHash(current, h, cctx->hashTable, tableType);
- if ((dictIssue == dictSmall) && (matchIndex < prefixIdxLimit)) continue; /* match outside of valid area */
- if ((tableType != byU16) && (matchIndex+MAX_DISTANCE < current)) continue; /* too far */
- if (tableType == byU16) assert((current - matchIndex) <= MAX_DISTANCE); /* too_far presumed impossible with byU16 */
+ if ((dictIssue == dictSmall) && (matchIndex < prefixIdxLimit)) continue; /* match outside of valid area */
+ if ((tableType != byU16) && (current - matchIndex > MAX_DISTANCE)) continue; /* too far - note: works even if matchIndex overflows */
+ if (tableType == byU16) assert((current - matchIndex) <= MAX_DISTANCE); /* too_far presumed impossible with byU16 */
if (LZ4_read32(match) == LZ4_read32(ip)) {
if (maybe_extMem) offset = current - matchIndex;
@@ -861,7 +861,6 @@ _next_match:
/* Fill table */
LZ4_putPosition(ip-2, cctx->hashTable, tableType, base);
-#if 1
/* Test next position */
if (tableType == byPtr) {
@@ -901,7 +900,7 @@ _next_match:
}
LZ4_putIndexOnHash(current, h, cctx->hashTable, tableType);
if ( ((dictIssue==dictSmall) ? (matchIndex >= prefixIdxLimit) : 1)
- && ((tableType==byU16) ? 1 : (matchIndex+MAX_DISTANCE >= current))
+ && ((tableType==byU16) ? 1 : (current - matchIndex <= MAX_DISTANCE))
&& (LZ4_read32(match) == LZ4_read32(ip)) ) {
token=op++;
*token=0;
@@ -914,13 +913,6 @@ _next_match:
/* Prepare next loop */
forwardH = LZ4_hashPosition(++ip, tableType);
-#else
-
- /* Prepare next loop */
- forwardH = LZ4_hashPosition(ip, tableType);
-
-#endif
-
}
_last_literals: