diff --git a/src/java/net/jpountz/lz4/LZ4JNIFastDecompressor.java b/src/java/net/jpountz/lz4/LZ4JNIFastDecompressor.java index b669c533..0e7620a7 100644 --- a/src/java/net/jpountz/lz4/LZ4JNIFastDecompressor.java +++ b/src/java/net/jpountz/lz4/LZ4JNIFastDecompressor.java @@ -34,8 +34,14 @@ final class LZ4JNIFastDecompressor extends LZ4FastDecompressor { @Override public final int decompress(byte[] src, int srcOff, byte[] dest, int destOff, int destLen) { - SafeUtils.checkRange(src, srcOff); + int srcLen = src.length - srcOff; + SafeUtils.checkRange(src, srcOff, srcLen); SafeUtils.checkRange(dest, destOff, destLen); + + if (srcLen == 0) { + throw new LZ4Exception("Empty src"); + } + final int result = LZ4JNI.LZ4_decompress_fast(src, null, srcOff, dest, null, destOff, destLen); if (result < 0) { throw new LZ4Exception("Error decoding offset " + (srcOff - result) + " of input buffer"); @@ -46,9 +52,14 @@ public final int decompress(byte[] src, int srcOff, byte[] dest, int destOff, in @Override public int decompress(ByteBuffer src, int srcOff, ByteBuffer dest, int destOff, int destLen) { ByteBufferUtils.checkNotReadOnly(dest); - ByteBufferUtils.checkRange(src, srcOff); + int srcLen = src.capacity() - srcOff; + ByteBufferUtils.checkRange(src, srcOff, srcLen); ByteBufferUtils.checkRange(dest, destOff, destLen); + if (srcLen == 0) { + throw new LZ4Exception("Empty src"); + } + if ((src.hasArray() || src.isDirect()) && (dest.hasArray() || dest.isDirect())) { byte[] srcArr = null, destArr = null; ByteBuffer srcBuf = null, destBuf = null; diff --git a/src/test/net/jpountz/fuzz/LZ4DecompressorTest.java b/src/test/net/jpountz/fuzz/LZ4DecompressorTest.java index 163e34da..d966983d 100644 --- a/src/test/net/jpountz/fuzz/LZ4DecompressorTest.java +++ b/src/test/net/jpountz/fuzz/LZ4DecompressorTest.java @@ -31,17 +31,17 @@ private void test(FuzzedDataProvider data, LZ4Factory factory, boolean fast, boo if (fast) { factory.fastDecompressor().decompress(srcBuf, srcOff, destBuf, destOff, destLen); } else { - factory.safeDecompressor().decompress(srcBuf, srcOff, src.length - srcOffEnd, destBuf, destOff, destLen); + factory.safeDecompressor().decompress(srcBuf, srcOff, src.length - srcOffEnd - srcOff, destBuf, destOff, destLen); } } else { byte[] dest = new byte[destOff + destLen]; if (fast) { factory.fastDecompressor().decompress(src, srcOff, dest, destOff, destLen); } else { - factory.safeDecompressor().decompress(src, srcOff, src.length - srcOffEnd, dest, destOff); + factory.safeDecompressor().decompress(src, srcOff, src.length - srcOffEnd - srcOff, dest, destOff); } } - } catch (LZ4Exception | ArrayIndexOutOfBoundsException ignored) { + } catch (LZ4Exception ignored) { } }