You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by bo...@apache.org on 2019/08/31 12:19:50 UTC

[commons-compress] branch master updated: COMPRESS-491 InputStream contract says "return 0 if length is 0, don't try to read"

This is an automated email from the ASF dual-hosted git repository.

bodewig pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-compress.git


The following commit(s) were added to refs/heads/master by this push:
     new d3a0a30  COMPRESS-491 InputStream contract says "return 0 if length is 0, don't try to read"
d3a0a30 is described below

commit d3a0a309d902e3639654731e07ccfb51fed9688a
Author: Stefan Bodewig <bo...@apache.org>
AuthorDate: Sat Aug 31 14:18:00 2019 +0200

    COMPRESS-491 InputStream contract says "return 0 if length is 0, don't try to read"
---
 .../commons/compress/archivers/ar/ArArchiveInputStream.java      | 3 +++
 .../commons/compress/archivers/arj/ArjArchiveInputStream.java    | 3 +++
 .../commons/compress/archivers/cpio/CpioArchiveInputStream.java  | 3 +++
 .../commons/compress/archivers/dump/DumpArchiveInputStream.java  | 3 +++
 .../apache/commons/compress/archivers/dump/TapeInputStream.java  | 3 +++
 .../archivers/sevenz/BoundedSeekableByteChannelInputStream.java  | 3 +++
 .../org/apache/commons/compress/archivers/sevenz/SevenZFile.java | 6 ++++++
 .../commons/compress/archivers/tar/TarArchiveInputStream.java    | 3 +++
 .../commons/compress/archivers/zip/ZipArchiveInputStream.java    | 6 ++++++
 .../compress/compressors/bzip2/BZip2CompressorInputStream.java   | 3 +++
 .../compressors/deflate/DeflateCompressorInputStream.java        | 3 +++
 .../compressors/deflate64/Deflate64CompressorInputStream.java    | 5 ++++-
 .../commons/compress/compressors/deflate64/HuffmanDecoder.java   | 9 +++++++++
 .../compress/compressors/gzip/GzipCompressorInputStream.java     | 3 +++
 .../compress/compressors/lz4/BlockLZ4CompressorInputStream.java  | 3 +++
 .../compress/compressors/lz4/FramedLZ4CompressorInputStream.java | 3 +++
 .../apache/commons/compress/compressors/lzw/LZWInputStream.java  | 3 +++
 .../compressors/snappy/FramedSnappyCompressorInputStream.java    | 3 +++
 .../compress/compressors/snappy/SnappyCompressorInputStream.java | 3 +++
 .../commons/compress/compressors/xz/XZCompressorInputStream.java | 3 +++
 .../compressors/zstandard/ZstdCompressorInputStream.java         | 3 +++
 .../org/apache/commons/compress/utils/BoundedInputStream.java    | 3 +++
 .../commons/compress/utils/ChecksumCalculatingInputStream.java   | 3 +++
 .../commons/compress/utils/ChecksumVerifyingInputStream.java     | 3 +++
 .../org/apache/commons/compress/utils/CountingInputStream.java   | 3 +++
 25 files changed, 88 insertions(+), 1 deletion(-)

diff --git a/src/main/java/org/apache/commons/compress/archivers/ar/ArArchiveInputStream.java b/src/main/java/org/apache/commons/compress/archivers/ar/ArArchiveInputStream.java
index 97b0664..dbac174 100644
--- a/src/main/java/org/apache/commons/compress/archivers/ar/ArArchiveInputStream.java
+++ b/src/main/java/org/apache/commons/compress/archivers/ar/ArArchiveInputStream.java
@@ -257,6 +257,9 @@ public class ArArchiveInputStream extends ArchiveInputStream {
      */
     @Override
     public int read(final byte[] b, final int off, final int len) throws IOException {
+        if (len == 0) {
+            return 0;
+        }
         if (currentEntry == null) {
             throw new IllegalStateException("No current ar entry");
         }
diff --git a/src/main/java/org/apache/commons/compress/archivers/arj/ArjArchiveInputStream.java b/src/main/java/org/apache/commons/compress/archivers/arj/ArjArchiveInputStream.java
index 2f88857..06b3274 100644
--- a/src/main/java/org/apache/commons/compress/archivers/arj/ArjArchiveInputStream.java
+++ b/src/main/java/org/apache/commons/compress/archivers/arj/ArjArchiveInputStream.java
@@ -345,6 +345,9 @@ public class ArjArchiveInputStream extends ArchiveInputStream {
 
     @Override
     public int read(final byte[] b, final int off, final int len) throws IOException {
+        if (len == 0) {
+            return 0;
+        }
         if (currentLocalFileHeader == null) {
             throw new IllegalStateException("No current arj entry");
         }
diff --git a/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStream.java b/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStream.java
index da20cf8..e9406eb 100644
--- a/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStream.java
+++ b/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStream.java
@@ -303,6 +303,9 @@ public class CpioArchiveInputStream extends ArchiveInputStream implements
     @Override
     public int read(final byte[] b, final int off, final int len)
             throws IOException {
+        if (len == 0) {
+            return 0;
+        }
         ensureOpen();
         if (off < 0 || len < 0 || off > b.length - len) {
             throw new IndexOutOfBoundsException();
diff --git a/src/main/java/org/apache/commons/compress/archivers/dump/DumpArchiveInputStream.java b/src/main/java/org/apache/commons/compress/archivers/dump/DumpArchiveInputStream.java
index 544765b..0735b6a 100644
--- a/src/main/java/org/apache/commons/compress/archivers/dump/DumpArchiveInputStream.java
+++ b/src/main/java/org/apache/commons/compress/archivers/dump/DumpArchiveInputStream.java
@@ -465,6 +465,9 @@ public class DumpArchiveInputStream extends ArchiveInputStream {
      */
     @Override
     public int read(final byte[] buf, int off, int len) throws IOException {
+        if (len == 0) {
+            return 0;
+        }
         int totalRead = 0;
 
         if (hasHitEOF || isClosed || entryOffset >= entrySize) {
diff --git a/src/main/java/org/apache/commons/compress/archivers/dump/TapeInputStream.java b/src/main/java/org/apache/commons/compress/archivers/dump/TapeInputStream.java
index 471c53e..4ca1b86 100644
--- a/src/main/java/org/apache/commons/compress/archivers/dump/TapeInputStream.java
+++ b/src/main/java/org/apache/commons/compress/archivers/dump/TapeInputStream.java
@@ -120,6 +120,9 @@ class TapeInputStream extends FilterInputStream {
      */
     @Override
     public int read(final byte[] b, int off, final int len) throws IOException {
+        if (len == 0) {
+            return 0;
+        }
         if ((len % RECORD_SIZE) != 0) {
             throw new IllegalArgumentException(
                 "All reads must be multiple of record size (" + RECORD_SIZE +
diff --git a/src/main/java/org/apache/commons/compress/archivers/sevenz/BoundedSeekableByteChannelInputStream.java b/src/main/java/org/apache/commons/compress/archivers/sevenz/BoundedSeekableByteChannelInputStream.java
index a51afb1..3b3689e 100644
--- a/src/main/java/org/apache/commons/compress/archivers/sevenz/BoundedSeekableByteChannelInputStream.java
+++ b/src/main/java/org/apache/commons/compress/archivers/sevenz/BoundedSeekableByteChannelInputStream.java
@@ -54,6 +54,9 @@ class BoundedSeekableByteChannelInputStream extends InputStream {
 
     @Override
     public int read(final byte[] b, final int off, final int len) throws IOException {
+        if (len == 0) {
+            return 0;
+        }
         if (bytesRemaining <= 0) {
             return -1;
         }
diff --git a/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java b/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java
index 7a02d78..d32536e 100644
--- a/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java
+++ b/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java
@@ -1140,6 +1140,9 @@ public class SevenZFile implements Closeable {
             }
             @Override
             public int read(final byte[] b, final int off, final int len) throws IOException {
+                if (len == 0) {
+                    return 0;
+                }
                 final int r = in.read(b, off, len);
                 if (r >= 0) {
                     count(r);
@@ -1228,6 +1231,9 @@ public class SevenZFile implements Closeable {
      *             if an I/O error has occurred
      */
     public int read(final byte[] b, final int off, final int len) throws IOException {
+        if (len == 0) {
+            return 0;
+        }
         int cnt = getCurrentStream().read(b, off, len);
         if (cnt > 0) {
             uncompressedBytesReadFromCurrentEntry += cnt;
diff --git a/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java b/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java
index 1e64f32..7ec8ed7 100644
--- a/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java
+++ b/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java
@@ -624,6 +624,9 @@ public class TarArchiveInputStream extends ArchiveInputStream {
      */
     @Override
     public int read(final byte[] buf, final int offset, int numToRead) throws IOException {
+        if (numToRead == 0) {
+            return 0;
+        }
     	int totalRead = 0;
 
         if (isAtEOF() || isDirectory() || entryOffset >= entrySize) {
diff --git a/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java b/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java
index 5b711dd..48ad5d5 100644
--- a/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java
+++ b/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java
@@ -428,6 +428,9 @@ public class ZipArchiveInputStream extends ArchiveInputStream implements InputSt
 
     @Override
     public int read(final byte[] buffer, final int offset, final int length) throws IOException {
+        if (length == 0) {
+            return 0;
+        }
         if (closed) {
             throw new IOException("The stream is closed");
         }
@@ -1256,6 +1259,9 @@ public class ZipArchiveInputStream extends ArchiveInputStream implements InputSt
 
         @Override
         public int read(final byte[] b, final int off, final int len) throws IOException {
+            if (len == 0) {
+                return 0;
+            }
             if (max >= 0 && pos >= max) {
                 return -1;
             }
diff --git a/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorInputStream.java
index 1a5e2ab..cd82a99 100644
--- a/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorInputStream.java
+++ b/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorInputStream.java
@@ -154,6 +154,9 @@ public class BZip2CompressorInputStream extends CompressorInputStream
     @Override
     public int read(final byte[] dest, final int offs, final int len)
         throws IOException {
+        if (len == 0) {
+            return 0;
+        }
         if (offs < 0) {
             throw new IndexOutOfBoundsException("offs(" + offs + ") < 0.");
         }
diff --git a/src/main/java/org/apache/commons/compress/compressors/deflate/DeflateCompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/deflate/DeflateCompressorInputStream.java
index 0e07284..a35ff6e 100644
--- a/src/main/java/org/apache/commons/compress/compressors/deflate/DeflateCompressorInputStream.java
+++ b/src/main/java/org/apache/commons/compress/compressors/deflate/DeflateCompressorInputStream.java
@@ -80,6 +80,9 @@ public class DeflateCompressorInputStream extends CompressorInputStream
     /** {@inheritDoc} */
     @Override
     public int read(final byte[] buf, final int off, final int len) throws IOException {
+        if (len == 0) {
+            return 0;
+        }
         final int ret = in.read(buf, off, len);
         count(ret);
         return ret;
diff --git a/src/main/java/org/apache/commons/compress/compressors/deflate64/Deflate64CompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/deflate64/Deflate64CompressorInputStream.java
index 8cbe44d..4b3e872 100644
--- a/src/main/java/org/apache/commons/compress/compressors/deflate64/Deflate64CompressorInputStream.java
+++ b/src/main/java/org/apache/commons/compress/compressors/deflate64/Deflate64CompressorInputStream.java
@@ -72,10 +72,13 @@ public class Deflate64CompressorInputStream extends CompressorInputStream implem
     }
 
     /**
-     * @throws java.io.EOFException if the underlying stream is exhausted before the end of defalted data was reached.
+     * @throws java.io.EOFException if the underlying stream is exhausted before the end of deflated data was reached.
      */
     @Override
     public int read(byte[] b, int off, int len) throws IOException {
+        if (len == 0) {
+            return 0;
+        }
         int read = -1;
         if (decoder != null) {
             read = decoder.decode(b, off, len);
diff --git a/src/main/java/org/apache/commons/compress/compressors/deflate64/HuffmanDecoder.java b/src/main/java/org/apache/commons/compress/compressors/deflate64/HuffmanDecoder.java
index a6afa2c..1df6e3c 100644
--- a/src/main/java/org/apache/commons/compress/compressors/deflate64/HuffmanDecoder.java
+++ b/src/main/java/org/apache/commons/compress/compressors/deflate64/HuffmanDecoder.java
@@ -214,6 +214,9 @@ class HuffmanDecoder implements Closeable {
 
         @Override
         int read(byte[] b, int off, int len) throws IOException {
+            if (len == 0) {
+                return 0;
+            }
             // as len is an int and (blockLength - read) is >= 0 the min must fit into an int as well
             int max = (int) Math.min(blockLength - read, len);
             int readSoFar = 0;
@@ -255,6 +258,9 @@ class HuffmanDecoder implements Closeable {
 
         @Override
         int read(byte[] b, int off, int len) throws IOException {
+            if (len == 0) {
+                return 0;
+            }
             throw new IllegalStateException("Cannot read in this state");
         }
 
@@ -292,6 +298,9 @@ class HuffmanDecoder implements Closeable {
 
         @Override
         int read(byte[] b, int off, int len) throws IOException {
+            if (len == 0) {
+                return 0;
+            }
             return decodeNext(b, off, len);
         }
 
diff --git a/src/main/java/org/apache/commons/compress/compressors/gzip/GzipCompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/gzip/GzipCompressorInputStream.java
index 99b48ad..ed47982 100644
--- a/src/main/java/org/apache/commons/compress/compressors/gzip/GzipCompressorInputStream.java
+++ b/src/main/java/org/apache/commons/compress/compressors/gzip/GzipCompressorInputStream.java
@@ -286,6 +286,9 @@ public class GzipCompressorInputStream extends CompressorInputStream
      */
     @Override
     public int read(final byte[] b, int off, int len) throws IOException {
+        if (len == 0) {
+            return 0;
+        }
         if (endReached) {
             return -1;
         }
diff --git a/src/main/java/org/apache/commons/compress/compressors/lz4/BlockLZ4CompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/lz4/BlockLZ4CompressorInputStream.java
index 72b0f60..70fcb9d 100644
--- a/src/main/java/org/apache/commons/compress/compressors/lz4/BlockLZ4CompressorInputStream.java
+++ b/src/main/java/org/apache/commons/compress/compressors/lz4/BlockLZ4CompressorInputStream.java
@@ -61,6 +61,9 @@ public class BlockLZ4CompressorInputStream extends AbstractLZ77CompressorInputSt
      */
     @Override
     public int read(final byte[] b, final int off, final int len) throws IOException {
+        if (len == 0) {
+            return 0;
+        }
         switch (state) {
         case EOF:
             return -1;
diff --git a/src/main/java/org/apache/commons/compress/compressors/lz4/FramedLZ4CompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/lz4/FramedLZ4CompressorInputStream.java
index 9792b7b..c316fd3 100644
--- a/src/main/java/org/apache/commons/compress/compressors/lz4/FramedLZ4CompressorInputStream.java
+++ b/src/main/java/org/apache/commons/compress/compressors/lz4/FramedLZ4CompressorInputStream.java
@@ -139,6 +139,9 @@ public class FramedLZ4CompressorInputStream extends CompressorInputStream
     /** {@inheritDoc} */
     @Override
     public int read(final byte[] b, final int off, final int len) throws IOException {
+        if (len == 0) {
+            return 0;
+        }
         if (endReached) {
             return -1;
         }
diff --git a/src/main/java/org/apache/commons/compress/compressors/lzw/LZWInputStream.java b/src/main/java/org/apache/commons/compress/compressors/lzw/LZWInputStream.java
index 7c6ab1f..4f14387 100644
--- a/src/main/java/org/apache/commons/compress/compressors/lzw/LZWInputStream.java
+++ b/src/main/java/org/apache/commons/compress/compressors/lzw/LZWInputStream.java
@@ -72,6 +72,9 @@ public abstract class LZWInputStream extends CompressorInputStream implements In
 
     @Override
     public int read(final byte[] b, final int off, final int len) throws IOException {
+        if (len == 0) {
+            return 0;
+        }
         int bytesRead = readFromStack(b, off, len);
         while (len - bytesRead > 0) {
             final int result = decompressNextSymbol();
diff --git a/src/main/java/org/apache/commons/compress/compressors/snappy/FramedSnappyCompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/snappy/FramedSnappyCompressorInputStream.java
index f750c4f..b2864bc 100644
--- a/src/main/java/org/apache/commons/compress/compressors/snappy/FramedSnappyCompressorInputStream.java
+++ b/src/main/java/org/apache/commons/compress/compressors/snappy/FramedSnappyCompressorInputStream.java
@@ -161,6 +161,9 @@ public class FramedSnappyCompressorInputStream extends CompressorInputStream
     /** {@inheritDoc} */
     @Override
     public int read(final byte[] b, final int off, final int len) throws IOException {
+        if (len == 0) {
+            return 0;
+        }
         int read = readOnce(b, off, len);
         if (read == -1) {
             readNextBlock();
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 d9acedb..da43648 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
@@ -91,6 +91,9 @@ public class SnappyCompressorInputStream extends AbstractLZ77CompressorInputStre
      */
     @Override
     public int read(final byte[] b, final int off, final int len) throws IOException {
+        if (len == 0) {
+            return 0;
+        }
         if (endReached) {
             return -1;
         }
diff --git a/src/main/java/org/apache/commons/compress/compressors/xz/XZCompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/xz/XZCompressorInputStream.java
index 20d67a1..e977448 100644
--- a/src/main/java/org/apache/commons/compress/compressors/xz/XZCompressorInputStream.java
+++ b/src/main/java/org/apache/commons/compress/compressors/xz/XZCompressorInputStream.java
@@ -149,6 +149,9 @@ public class XZCompressorInputStream extends CompressorInputStream
 
     @Override
     public int read(final byte[] buf, final int off, final int len) throws IOException {
+        if (len == 0) {
+            return 0;
+        }
         try {
             final int ret = in.read(buf, off, len);
             count(ret);
diff --git a/src/main/java/org/apache/commons/compress/compressors/zstandard/ZstdCompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/zstandard/ZstdCompressorInputStream.java
index f44d434..15b54c9 100644
--- a/src/main/java/org/apache/commons/compress/compressors/zstandard/ZstdCompressorInputStream.java
+++ b/src/main/java/org/apache/commons/compress/compressors/zstandard/ZstdCompressorInputStream.java
@@ -82,6 +82,9 @@ public class ZstdCompressorInputStream extends CompressorInputStream
 
     @Override
     public int read(final byte[] buf, final int off, final int len) throws IOException {
+        if (len == 0) {
+            return 0;
+        }
         final int ret = decIS.read(buf, off, len);
         count(ret);
         return ret;
diff --git a/src/main/java/org/apache/commons/compress/utils/BoundedInputStream.java b/src/main/java/org/apache/commons/compress/utils/BoundedInputStream.java
index 8c3465d..e089631 100644
--- a/src/main/java/org/apache/commons/compress/utils/BoundedInputStream.java
+++ b/src/main/java/org/apache/commons/compress/utils/BoundedInputStream.java
@@ -51,6 +51,9 @@ public class BoundedInputStream extends InputStream {
 
     @Override
     public int read(final byte[] b, final int off, final int len) throws IOException {
+        if (len == 0) {
+            return 0;
+        }
         if (bytesRemaining == 0) {
             return -1;
         }
diff --git a/src/main/java/org/apache/commons/compress/utils/ChecksumCalculatingInputStream.java b/src/main/java/org/apache/commons/compress/utils/ChecksumCalculatingInputStream.java
index 4a408a5..a722bea 100644
--- a/src/main/java/org/apache/commons/compress/utils/ChecksumCalculatingInputStream.java
+++ b/src/main/java/org/apache/commons/compress/utils/ChecksumCalculatingInputStream.java
@@ -78,6 +78,9 @@ public class ChecksumCalculatingInputStream extends InputStream {
      */
     @Override
     public int read(final byte[] b, final int off, final int len) throws IOException {
+        if (len == 0) {
+            return 0;
+        }
         final int ret = in.read(b, off, len);
         if (ret >= 0) {
             checksum.update(b, off, ret);
diff --git a/src/main/java/org/apache/commons/compress/utils/ChecksumVerifyingInputStream.java b/src/main/java/org/apache/commons/compress/utils/ChecksumVerifyingInputStream.java
index a7d8d6c..726acaa 100644
--- a/src/main/java/org/apache/commons/compress/utils/ChecksumVerifyingInputStream.java
+++ b/src/main/java/org/apache/commons/compress/utils/ChecksumVerifyingInputStream.java
@@ -82,6 +82,9 @@ public class ChecksumVerifyingInputStream extends InputStream {
      */
     @Override
     public int read(final byte[] b, final int off, final int len) throws IOException {
+        if (len == 0) {
+            return 0;
+        }
         final int ret = in.read(b, off, len);
         if (ret >= 0) {
             checksum.update(b, off, ret);
diff --git a/src/main/java/org/apache/commons/compress/utils/CountingInputStream.java b/src/main/java/org/apache/commons/compress/utils/CountingInputStream.java
index 461071e..2184564 100644
--- a/src/main/java/org/apache/commons/compress/utils/CountingInputStream.java
+++ b/src/main/java/org/apache/commons/compress/utils/CountingInputStream.java
@@ -48,6 +48,9 @@ public class CountingInputStream extends FilterInputStream {
     }
     @Override
     public int read(final byte[] b, final int off, final int len) throws IOException {
+        if (len == 0) {
+            return 0;
+        }
         final int r = in.read(b, off, len);
         if (r >= 0) {
             count(r);