diff options
author | Yann Collet <cyan@fb.com> | 2018-04-17 22:29:17 (GMT) |
---|---|---|
committer | Yann Collet <cyan@fb.com> | 2018-04-17 22:29:17 (GMT) |
commit | 152064218361e5762fd67b5de425707fdc47095b (patch) | |
tree | a6b0bfe1b39ee9d2e26a199f6f990e375abe0eb1 /lib | |
parent | ce78d10c1f8afd13fbea0071c70d48c8744e43d2 (diff) | |
download | lz4-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.c | 16 |
1 files changed, 4 insertions, 12 deletions
@@ -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: |