SnappyInputStream must slide then window when before writing beyond buffer may be related to COMPRESS-358
Project: http://git-wip-us.apache.org/repos/asf/commons-compress/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-compress/commit/d9421dc3 Tree: http://git-wip-us.apache.org/repos/asf/commons-compress/tree/d9421dc3 Diff: http://git-wip-us.apache.org/repos/asf/commons-compress/diff/d9421dc3 Branch: refs/heads/master Commit: d9421dc3c843177ba7d59ea47319997cfdecc697 Parents: 9ae3752 Author: Stefan Bodewig <[email protected]> Authored: Mon Jan 9 15:27:25 2017 +0100 Committer: Stefan Bodewig <[email protected]> Committed: Mon Jan 9 15:27:25 2017 +0100 ---------------------------------------------------------------------- .../snappy/SnappyCompressorInputStream.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-compress/blob/d9421dc3/src/main/java/org/apache/commons/compress/compressors/snappy/SnappyCompressorInputStream.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/compress/compressors/snappy/SnappyCompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/snappy/SnappyCompressorInputStream.java index 781ebbf..faeabff 100644 --- a/src/main/java/org/apache/commons/compress/compressors/snappy/SnappyCompressorInputStream.java +++ b/src/main/java/org/apache/commons/compress/compressors/snappy/SnappyCompressorInputStream.java @@ -310,6 +310,7 @@ public class SnappyCompressorInputStream extends CompressorInputStream { * @return True if the decompressed data should be flushed */ private boolean expandLiteral(final int length) throws IOException { + boolean shouldFlush = ensureBufferSpace(length); final int bytesRead = IOUtils.readFully(in, decompressBuf, writeIndex, length); count(bytesRead); if (length != bytesRead) { @@ -317,7 +318,15 @@ public class SnappyCompressorInputStream extends CompressorInputStream { } writeIndex += length; - return writeIndex >= 2 * this.blockSize; + return shouldFlush || writeIndex >= 2 * this.blockSize; + } + + private boolean ensureBufferSpace(final int length) { + if (writeIndex + length >= decompressBuf.length) { + slideBuffer(); + return true; + } + return false; } /** @@ -344,6 +353,7 @@ public class SnappyCompressorInputStream extends CompressorInputStream { throw new IOException("Offset is larger than block size"); } final int offset = (int) off; + boolean shouldFlush = ensureBufferSpace(length); if (offset == 1) { final byte lastChar = decompressBuf[writeIndex - 1]; @@ -371,7 +381,7 @@ public class SnappyCompressorInputStream extends CompressorInputStream { writeIndex += pad; } } - return writeIndex >= 2 * this.blockSize; + return shouldFlush || writeIndex >= 2 * this.blockSize; } /**
