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;
     }
 
     /**

Reply via email to