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 2018/04/22 16:21:36 UTC

[1/3] commons-compress git commit: COMPRESS-445 provide statistics when uncompressing

Repository: commons-compress
Updated Branches:
  refs/heads/master 166b186e8 -> 0646aa7d4


COMPRESS-445 provide statistics when uncompressing

patch by Andreas Beeker


Project: http://git-wip-us.apache.org/repos/asf/commons-compress/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-compress/commit/02c963a4
Tree: http://git-wip-us.apache.org/repos/asf/commons-compress/tree/02c963a4
Diff: http://git-wip-us.apache.org/repos/asf/commons-compress/diff/02c963a4

Branch: refs/heads/master
Commit: 02c963a47ecb50a7f84b9711841e60447f9bfcc1
Parents: 166b186
Author: Stefan Bodewig <bo...@apache.org>
Authored: Sun Apr 22 17:58:39 2018 +0200
Committer: Stefan Bodewig <bo...@apache.org>
Committed: Sun Apr 22 17:58:39 2018 +0200

----------------------------------------------------------------------
 .../archivers/zip/ExplodingInputStream.java     |  23 +++++-
 .../archivers/zip/InflaterInputStream.java      |  80 +++++++++++++++++++
 .../archivers/zip/ZipArchiveInputStream.java    |  20 ++++-
 .../commons/compress/archivers/zip/ZipFile.java |   1 -
 .../bzip2/BZip2CompressorInputStream.java       |  15 +++-
 .../Deflate64CompressorInputStream.java         |  14 +++-
 .../compressors/deflate64/HuffmanDecoder.java   |   4 +
 .../compressors/lzw/LZWInputStream.java         |  11 ++-
 .../commons/compress/utils/BitInputStream.java  |   9 ++-
 .../compress/utils/InputStreamStatistics.java   |  36 +++++++++
 .../commons/compress/archivers/ZipTestCase.java |  57 ++++++++++++-
 src/test/resources/zipbomb.xlsx                 | Bin 0 -> 18348 bytes
 12 files changed, 257 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-compress/blob/02c963a4/src/main/java/org/apache/commons/compress/archivers/zip/ExplodingInputStream.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/compress/archivers/zip/ExplodingInputStream.java b/src/main/java/org/apache/commons/compress/archivers/zip/ExplodingInputStream.java
index 126edab..71e4cb9 100644
--- a/src/main/java/org/apache/commons/compress/archivers/zip/ExplodingInputStream.java
+++ b/src/main/java/org/apache/commons/compress/archivers/zip/ExplodingInputStream.java
@@ -19,6 +19,9 @@
 
 package org.apache.commons.compress.archivers.zip;
 
+import org.apache.commons.compress.utils.CountingInputStream;
+import org.apache.commons.compress.utils.InputStreamStatistics;
+
 import java.io.IOException;
 import java.io.InputStream;
 
@@ -34,7 +37,7 @@ import java.io.InputStream;
  * @author Emmanuel Bourg
  * @since 1.7
  */
-class ExplodingInputStream extends InputStream {
+class ExplodingInputStream extends InputStream implements InputStreamStatistics {
 
     /** The underlying stream containing the compressed data */
     private final InputStream in;
@@ -62,6 +65,8 @@ class ExplodingInputStream extends InputStream {
     /** Output buffer holding the decompressed data */
     private final CircularBuffer buffer = new CircularBuffer(32 * 1024);
 
+    private long uncompressedCount = 0;
+
     /**
      * Create a new stream decompressing the content of the specified stream
      * using the explode algorithm.
@@ -107,7 +112,21 @@ class ExplodingInputStream extends InputStream {
             fillBuffer();
         }
 
-        return buffer.get();
+        final int ret = buffer.get();
+        if (ret > -1) {
+            uncompressedCount++;
+        }
+        return ret;
+    }
+
+    @Override
+    public long getCompressedCount() {
+        return bits.getBytesRead();
+    }
+
+    @Override
+    public long getUncompressedCount() {
+        return uncompressedCount;
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/02c963a4/src/main/java/org/apache/commons/compress/archivers/zip/InflaterInputStream.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/compress/archivers/zip/InflaterInputStream.java b/src/main/java/org/apache/commons/compress/archivers/zip/InflaterInputStream.java
new file mode 100644
index 0000000..1213a1b
--- /dev/null
+++ b/src/main/java/org/apache/commons/compress/archivers/zip/InflaterInputStream.java
@@ -0,0 +1,80 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+package org.apache.commons.compress.archivers.zip;
+
+import org.apache.commons.compress.utils.InputStreamStatistics;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.zip.Inflater;
+
+/**
+ * Helper class to provide statistics
+ */
+/* package */ class InflaterInputStream extends java.util.zip.InflaterInputStream
+    implements InputStreamStatistics {
+    private long compressedCount = 0;
+    private long uncompressedCount = 0;
+
+    public InflaterInputStream(InputStream in) {
+        super(in);
+    }
+
+    public InflaterInputStream(InputStream in, Inflater inf) {
+        super(in, inf);
+    }
+
+    public InflaterInputStream(InputStream in, Inflater inf, int size) {
+        super(in, inf, size);
+    }
+
+    @Override
+    protected void fill() throws IOException {
+        super.fill();
+        compressedCount += inf.getRemaining();
+    }
+
+    @Override
+    public int read() throws IOException {
+        final int b = super.read();
+        if (b > -1) {
+            uncompressedCount++;
+        }
+        return b;
+    }
+
+    @Override
+    public int read(byte[] b, int off, int len) throws IOException {
+        final int bytes = super.read(b, off, len);
+        if (bytes > -1) {
+            uncompressedCount += bytes;
+        }
+        return bytes;
+    }
+
+    @Override
+    public long getCompressedCount() {
+        return compressedCount;
+    }
+
+    @Override
+    public long getUncompressedCount() {
+        return uncompressedCount;
+    }
+}

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/02c963a4/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java
----------------------------------------------------------------------
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 eddeb25..12009b0 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
@@ -37,6 +37,7 @@ import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
 import org.apache.commons.compress.compressors.deflate64.Deflate64CompressorInputStream;
 import org.apache.commons.compress.utils.ArchiveUtils;
 import org.apache.commons.compress.utils.IOUtils;
+import org.apache.commons.compress.utils.InputStreamStatistics;
 
 import static org.apache.commons.compress.archivers.zip.ZipConstants.DWORD;
 import static org.apache.commons.compress.archivers.zip.ZipConstants.SHORT;
@@ -75,7 +76,7 @@ import static org.apache.commons.compress.archivers.zip.ZipConstants.ZIP64_MAGIC
  * @see ZipFile
  * @NotThreadSafe
  */
-public class ZipArchiveInputStream extends ArchiveInputStream {
+public class ZipArchiveInputStream extends ArchiveInputStream implements InputStreamStatistics {
 
     /** The zip encoding to use for filenames and the file comment. */
     private final ZipEncoding zipEncoding;
@@ -114,6 +115,9 @@ public class ZipArchiveInputStream extends ArchiveInputStream {
     /** Whether the stream will try to read STORED entries that use a data descriptor. */
     private boolean allowStoredEntriesWithDataDescriptor = false;
 
+    /** Count decompressed bytes for current entry */
+    private long uncompressedCount = 0;
+
     private static final int LFH_LEN = 30;
     /*
       local file header signature     WORD
@@ -218,6 +222,8 @@ public class ZipArchiveInputStream extends ArchiveInputStream {
     }
 
     public ZipArchiveEntry getNextZipEntry() throws IOException {
+        uncompressedCount = 0;
+
         boolean firstEntry = true;
         if (closed || hitCentralDirectory) {
             return null;
@@ -460,11 +466,23 @@ public class ZipArchiveInputStream extends ArchiveInputStream {
 
         if (read >= 0) {
             current.crc.update(buffer, offset, read);
+            uncompressedCount += read;
         }
 
         return read;
     }
 
+    @Override
+    public long getCompressedCount() {
+        final long infBytes = inf.getBytesRead();
+        return (infBytes > 0) ? infBytes : current.bytesReadFromStream;
+    }
+
+    @Override
+    public long getUncompressedCount() {
+        return uncompressedCount;
+    }
+
     /**
      * Implementation of read for STORED entries.
      */

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/02c963a4/src/main/java/org/apache/commons/compress/archivers/zip/ZipFile.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/compress/archivers/zip/ZipFile.java b/src/main/java/org/apache/commons/compress/archivers/zip/ZipFile.java
index 6a2c2a2..5aa8165 100644
--- a/src/main/java/org/apache/commons/compress/archivers/zip/ZipFile.java
+++ b/src/main/java/org/apache/commons/compress/archivers/zip/ZipFile.java
@@ -40,7 +40,6 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.zip.Inflater;
-import java.util.zip.InflaterInputStream;
 import java.util.zip.ZipException;
 
 import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/02c963a4/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorInputStream.java
----------------------------------------------------------------------
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 9c7a80a..d82713e 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
@@ -32,14 +32,15 @@ import java.util.Arrays;
 import org.apache.commons.compress.compressors.CompressorInputStream;
 import org.apache.commons.compress.utils.BitInputStream;
 import org.apache.commons.compress.utils.CloseShieldFilterInputStream;
+import org.apache.commons.compress.utils.InputStreamStatistics;
 
 /**
  * An input stream that decompresses from the BZip2 format to be read as any other stream.
  *
  * @NotThreadSafe
  */
-public class BZip2CompressorInputStream extends CompressorInputStream implements
-                                                                          BZip2Constants {
+public class BZip2CompressorInputStream extends CompressorInputStream
+implements BZip2Constants, InputStreamStatistics {
 
     /**
      * Index of the last char in the block, so the block size == last + 1.
@@ -181,6 +182,16 @@ public class BZip2CompressorInputStream extends CompressorInputStream implements
         return (destOffs == offs) ? -1 : (destOffs - offs);
     }
 
+    @Override
+    public long getCompressedCount() {
+        return bin.getBytesRead();
+    }
+
+    @Override
+    public long getUncompressedCount() {
+        return getBytesRead();
+    }
+
     private void makeMaps() {
         final boolean[] inUse = this.data.inUse;
         final byte[] seqToUnseq = this.data.seqToUnseq;

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/02c963a4/src/main/java/org/apache/commons/compress/compressors/deflate64/Deflate64CompressorInputStream.java
----------------------------------------------------------------------
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 4a82f55..02dc4f3 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
@@ -21,6 +21,8 @@ import java.io.IOException;
 import java.io.InputStream;
 
 import org.apache.commons.compress.compressors.CompressorInputStream;
+import org.apache.commons.compress.utils.InputStreamStatistics;
+
 import static org.apache.commons.compress.utils.IOUtils.closeQuietly;
 
 /**
@@ -29,7 +31,7 @@ import static org.apache.commons.compress.utils.IOUtils.closeQuietly;
  * @since 1.16
  * @NotThreadSafe
  */
-public class Deflate64CompressorInputStream extends CompressorInputStream {
+public class Deflate64CompressorInputStream extends CompressorInputStream implements InputStreamStatistics {
     private InputStream originalStream;
     private HuffmanDecoder decoder;
     private final byte[] oneByte = new byte[1];
@@ -98,6 +100,16 @@ public class Deflate64CompressorInputStream extends CompressorInputStream {
         }
     }
 
+    @Override
+    public long getCompressedCount() {
+        return decoder.getBytesRead();
+    }
+
+    @Override
+    public long getUncompressedCount() {
+        return getBytesRead();
+    }
+
     private void closeDecoder() {
         closeQuietly(decoder);
         decoder = null;

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/02c963a4/src/main/java/org/apache/commons/compress/compressors/deflate64/HuffmanDecoder.java
----------------------------------------------------------------------
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 a20f71d..1cc0c81 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
@@ -155,6 +155,10 @@ class HuffmanDecoder implements Closeable {
         return -1;
     }
 
+    public long getBytesRead() {
+        return reader.getBytesRead();
+    }
+
     private void switchToUncompressedState() throws IOException {
         reader.alignWithByteBoundary();
         long bLen = readBits(16);

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/02c963a4/src/main/java/org/apache/commons/compress/compressors/lzw/LZWInputStream.java
----------------------------------------------------------------------
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 c57d2ab..1ada577 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
@@ -25,6 +25,7 @@ import java.nio.ByteOrder;
 import org.apache.commons.compress.MemoryLimitException;
 import org.apache.commons.compress.compressors.CompressorInputStream;
 import org.apache.commons.compress.utils.BitInputStream;
+import org.apache.commons.compress.utils.InputStreamStatistics;
 
 /**
  * <p>Generic LZW implementation. It is used internally for
@@ -34,7 +35,7 @@ import org.apache.commons.compress.utils.BitInputStream;
  * @NotThreadSafe
  * @since 1.10
  */
-public abstract class LZWInputStream extends CompressorInputStream {
+public abstract class LZWInputStream extends CompressorInputStream implements InputStreamStatistics {
     protected static final int DEFAULT_CODE_SIZE = 9;
     protected static final int UNUSED_PREFIX = -1;
 
@@ -87,6 +88,14 @@ public abstract class LZWInputStream extends CompressorInputStream {
         return bytesRead;
     }
 
+    public long getCompressedCount() {
+        return in.getBytesRead();
+    }
+
+    public long getUncompressedCount() {
+        return getBytesRead();
+    }
+
     /**
      * Read the next code and expand it.
      * @return the expanded next code

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/02c963a4/src/main/java/org/apache/commons/compress/utils/BitInputStream.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/compress/utils/BitInputStream.java b/src/main/java/org/apache/commons/compress/utils/BitInputStream.java
index ad1f229..41c7449 100644
--- a/src/main/java/org/apache/commons/compress/utils/BitInputStream.java
+++ b/src/main/java/org/apache/commons/compress/utils/BitInputStream.java
@@ -38,7 +38,7 @@ public class BitInputStream implements Closeable {
         }
     }
 
-    private final InputStream in;
+    private final CountingInputStream in;
     private final ByteOrder byteOrder;
     private long bitsCached = 0;
     private int bitsCachedSize = 0;
@@ -50,7 +50,7 @@ public class BitInputStream implements Closeable {
      *      either BIG_ENDIAN (aaaaabbb bb000000) or LITTLE_ENDIAN (bbbaaaaa 000000bb)
      */
     public BitInputStream(final InputStream in, final ByteOrder byteOrder) {
-        this.in = in;
+        this.in = new CountingInputStream(in);
         this.byteOrder = byteOrder;
     }
 
@@ -187,4 +187,9 @@ public class BitInputStream implements Closeable {
         }
         return false;
     }
+
+
+    public long getBytesRead() {
+        return in.getBytesRead();
+    }
 }

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/02c963a4/src/main/java/org/apache/commons/compress/utils/InputStreamStatistics.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/compress/utils/InputStreamStatistics.java b/src/main/java/org/apache/commons/compress/utils/InputStreamStatistics.java
new file mode 100644
index 0000000..26baad5
--- /dev/null
+++ b/src/main/java/org/apache/commons/compress/utils/InputStreamStatistics.java
@@ -0,0 +1,36 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+package org.apache.commons.compress.utils;
+
+/**
+ * This interface provides statistics on the current decompression stream.
+ * The stream consumer can use that statistics to handle abnormal
+ * compression ratios, i.e. to prevent zip bombs.
+ */
+public interface InputStreamStatistics {
+    /**
+     * @return the amount of raw or compressed bytes read by the stream
+     */
+    long getCompressedCount();
+
+    /**
+    * @return the amount of decompressed bytes returned by the stream
+     */
+    long getUncompressedCount();
+}

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/02c963a4/src/test/java/org/apache/commons/compress/archivers/ZipTestCase.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/commons/compress/archivers/ZipTestCase.java b/src/test/java/org/apache/commons/compress/archivers/ZipTestCase.java
index b5e3b5c..4265cbc 100644
--- a/src/test/java/org/apache/commons/compress/archivers/ZipTestCase.java
+++ b/src/test/java/org/apache/commons/compress/archivers/ZipTestCase.java
@@ -27,9 +27,7 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.List;
+import java.util.*;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipException;
 
@@ -42,6 +40,7 @@ import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
 import org.apache.commons.compress.archivers.zip.ZipFile;
 import org.apache.commons.compress.archivers.zip.ZipMethod;
 import org.apache.commons.compress.utils.IOUtils;
+import org.apache.commons.compress.utils.InputStreamStatistics;
 import org.apache.commons.compress.utils.SeekableInMemoryByteChannel;
 import org.junit.Assert;
 import org.junit.Test;
@@ -598,4 +597,56 @@ public final class ZipTestCase extends AbstractTestCase {
             rmdir(tmp[0]);
         }
     }
+
+    @Test
+    public void testInputStreamStatistics() throws IOException, ArchiveException {
+        final File input = getFile("zipbomb.xlsx");
+
+        final Map<String,List<List<Long>>> map = new HashMap<>();
+
+        // stream access
+        try (final FileInputStream fis = new FileInputStream(input);
+            final ArchiveInputStream in = new ArchiveStreamFactory().createArchiveInputStream("zip", fis)) {
+            for (ArchiveEntry entry; (entry = in.getNextEntry()) != null; ) {
+                readStream(in, entry, map);
+            }
+        }
+
+        // file access
+        try (final ZipFile zf = new ZipFile(input)) {
+            final Enumeration<ZipArchiveEntry> entries = zf.getEntries();
+            while (entries.hasMoreElements()) {
+                final ZipArchiveEntry zae = entries.nextElement();
+                try (InputStream in = zf.getInputStream(zae)) {
+                    readStream(in, zae, map);
+                }
+            }
+        }
+
+        assertEquals(Arrays.asList(8390036L, 8600L), map.get("[Content_Types].xml").get(0));
+        assertEquals(Arrays.asList(1348L, 508L), map.get("xl/worksheets/sheet1.xml").get(0));
+
+        // compare statistics of stream / file access
+        for (Map.Entry<String,List<List<Long>>> me : map.entrySet()) {
+            assertEquals("Mismatch of stats for: "+me.getKey(), me.getValue().get(0), me.getValue().get(1));
+        }
+    }
+
+    private void readStream(final InputStream in, final ArchiveEntry entry, final Map<String,List<List<Long>>> map) throws IOException {
+        final byte[] buf = new byte[4096];
+        final InputStreamStatistics stats = (InputStreamStatistics)in;
+        while (in.read(buf) != -1);
+
+        final String name = entry.getName();
+        final List<List<Long>> l;
+        if (map.containsKey(name)) {
+            l = map.get(name);
+        } else {
+            map.put(name, l = new ArrayList<>());
+        }
+
+        final long t = stats.getUncompressedCount();
+        final long b = stats.getCompressedCount();
+        l.add(Arrays.asList(t, b));
+    }
 }

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/02c963a4/src/test/resources/zipbomb.xlsx
----------------------------------------------------------------------
diff --git a/src/test/resources/zipbomb.xlsx b/src/test/resources/zipbomb.xlsx
new file mode 100644
index 0000000..46a4211
Binary files /dev/null and b/src/test/resources/zipbomb.xlsx differ


[2/3] commons-compress git commit: COMPRESS-445 cosmetics

Posted by bo...@apache.org.
COMPRESS-445 cosmetics


Project: http://git-wip-us.apache.org/repos/asf/commons-compress/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-compress/commit/22c79b2f
Tree: http://git-wip-us.apache.org/repos/asf/commons-compress/tree/22c79b2f
Diff: http://git-wip-us.apache.org/repos/asf/commons-compress/diff/22c79b2f

Branch: refs/heads/master
Commit: 22c79b2f6abf6fbe7292e097dfb1edfaf8584613
Parents: 02c963a
Author: Stefan Bodewig <bo...@apache.org>
Authored: Sun Apr 22 18:20:10 2018 +0200
Committer: Stefan Bodewig <bo...@apache.org>
Committed: Sun Apr 22 18:20:10 2018 +0200

----------------------------------------------------------------------
 .../compress/archivers/zip/ExplodingInputStream.java |  6 ++++++
 .../compress/archivers/zip/InflaterInputStream.java  |  2 ++
 .../bzip2/BZip2CompressorInputStream.java            |  8 +++++++-
 .../deflate64/Deflate64CompressorInputStream.java    |  6 ++++++
 .../compressors/deflate64/HuffmanDecoder.java        |  5 ++++-
 .../compress/compressors/lzw/LZWInputStream.java     |  8 ++++++++
 .../commons/compress/utils/BitInputStream.java       | 15 +++++++++++----
 .../compress/utils/InputStreamStatistics.java        |  2 ++
 .../commons/compress/archivers/ZipTestCase.java      |  7 ++++++-
 9 files changed, 52 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-compress/blob/22c79b2f/src/main/java/org/apache/commons/compress/archivers/zip/ExplodingInputStream.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/compress/archivers/zip/ExplodingInputStream.java b/src/main/java/org/apache/commons/compress/archivers/zip/ExplodingInputStream.java
index 71e4cb9..bea9e4c 100644
--- a/src/main/java/org/apache/commons/compress/archivers/zip/ExplodingInputStream.java
+++ b/src/main/java/org/apache/commons/compress/archivers/zip/ExplodingInputStream.java
@@ -119,11 +119,17 @@ class ExplodingInputStream extends InputStream implements InputStreamStatistics
         return ret;
     }
 
+    /**
+     * @since 1.17
+     */
     @Override
     public long getCompressedCount() {
         return bits.getBytesRead();
     }
 
+    /**
+     * @since 1.17
+     */
     @Override
     public long getUncompressedCount() {
         return uncompressedCount;

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/22c79b2f/src/main/java/org/apache/commons/compress/archivers/zip/InflaterInputStream.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/compress/archivers/zip/InflaterInputStream.java b/src/main/java/org/apache/commons/compress/archivers/zip/InflaterInputStream.java
index 1213a1b..32d20e3 100644
--- a/src/main/java/org/apache/commons/compress/archivers/zip/InflaterInputStream.java
+++ b/src/main/java/org/apache/commons/compress/archivers/zip/InflaterInputStream.java
@@ -26,6 +26,8 @@ import java.util.zip.Inflater;
 
 /**
  * Helper class to provide statistics
+ *
+ * @since 1.17
  */
 /* package */ class InflaterInputStream extends java.util.zip.InflaterInputStream
     implements InputStreamStatistics {

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/22c79b2f/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorInputStream.java
----------------------------------------------------------------------
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 d82713e..54457cf 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
@@ -40,7 +40,7 @@ import org.apache.commons.compress.utils.InputStreamStatistics;
  * @NotThreadSafe
  */
 public class BZip2CompressorInputStream extends CompressorInputStream
-implements BZip2Constants, InputStreamStatistics {
+    implements BZip2Constants, InputStreamStatistics {
 
     /**
      * Index of the last char in the block, so the block size == last + 1.
@@ -182,11 +182,17 @@ implements BZip2Constants, InputStreamStatistics {
         return (destOffs == offs) ? -1 : (destOffs - offs);
     }
 
+    /**
+     * @since 1.17
+     */
     @Override
     public long getCompressedCount() {
         return bin.getBytesRead();
     }
 
+    /**
+     * @since 1.17
+     */
     @Override
     public long getUncompressedCount() {
         return getBytesRead();

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/22c79b2f/src/main/java/org/apache/commons/compress/compressors/deflate64/Deflate64CompressorInputStream.java
----------------------------------------------------------------------
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 02dc4f3..36b8a83 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
@@ -100,11 +100,17 @@ public class Deflate64CompressorInputStream extends CompressorInputStream implem
         }
     }
 
+    /**
+     * @since 1.17
+     */
     @Override
     public long getCompressedCount() {
         return decoder.getBytesRead();
     }
 
+    /**
+     * @since 1.17
+     */
     @Override
     public long getUncompressedCount() {
         return getBytesRead();

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/22c79b2f/src/main/java/org/apache/commons/compress/compressors/deflate64/HuffmanDecoder.java
----------------------------------------------------------------------
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 1cc0c81..a6afa2c 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
@@ -155,7 +155,10 @@ class HuffmanDecoder implements Closeable {
         return -1;
     }
 
-    public long getBytesRead() {
+    /**
+     * @since 1.17
+     */
+    long getBytesRead() {
         return reader.getBytesRead();
     }
 

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/22c79b2f/src/main/java/org/apache/commons/compress/compressors/lzw/LZWInputStream.java
----------------------------------------------------------------------
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 1ada577..9cdf680 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
@@ -88,10 +88,18 @@ public abstract class LZWInputStream extends CompressorInputStream implements In
         return bytesRead;
     }
 
+    /**
+     * @since 1.17
+     */
+    @Override
     public long getCompressedCount() {
         return in.getBytesRead();
     }
 
+    /**
+     * @since 1.17
+     */
+    @Override
     public long getUncompressedCount() {
         return getBytesRead();
     }

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/22c79b2f/src/main/java/org/apache/commons/compress/utils/BitInputStream.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/compress/utils/BitInputStream.java b/src/main/java/org/apache/commons/compress/utils/BitInputStream.java
index 41c7449..124e21f 100644
--- a/src/main/java/org/apache/commons/compress/utils/BitInputStream.java
+++ b/src/main/java/org/apache/commons/compress/utils/BitInputStream.java
@@ -125,6 +125,17 @@ public class BitInputStream implements Closeable {
         }
     }
 
+    /**
+     * Returns the number of bytes read from the underlying stream.
+     *
+     * <p>This includes the bytes read to fill the current cache and
+     * not read as bits so far.</p>
+     * @since 1.17
+     */
+    public long getBytesRead() {
+        return in.getBytesRead();
+    }
+
     private long processBitsGreater57(final int count) throws IOException {
         final long bitsOut;
         int overflowBits = 0;
@@ -188,8 +199,4 @@ public class BitInputStream implements Closeable {
         return false;
     }
 
-
-    public long getBytesRead() {
-        return in.getBytesRead();
-    }
 }

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/22c79b2f/src/main/java/org/apache/commons/compress/utils/InputStreamStatistics.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/compress/utils/InputStreamStatistics.java b/src/main/java/org/apache/commons/compress/utils/InputStreamStatistics.java
index 26baad5..b53e6f5 100644
--- a/src/main/java/org/apache/commons/compress/utils/InputStreamStatistics.java
+++ b/src/main/java/org/apache/commons/compress/utils/InputStreamStatistics.java
@@ -22,6 +22,8 @@ package org.apache.commons.compress.utils;
  * This interface provides statistics on the current decompression stream.
  * The stream consumer can use that statistics to handle abnormal
  * compression ratios, i.e. to prevent zip bombs.
+ *
+ * @since 1.17
  */
 public interface InputStreamStatistics {
     /**

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/22c79b2f/src/test/java/org/apache/commons/compress/archivers/ZipTestCase.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/commons/compress/archivers/ZipTestCase.java b/src/test/java/org/apache/commons/compress/archivers/ZipTestCase.java
index 4265cbc..4451a07 100644
--- a/src/test/java/org/apache/commons/compress/archivers/ZipTestCase.java
+++ b/src/test/java/org/apache/commons/compress/archivers/ZipTestCase.java
@@ -27,7 +27,12 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipException;
 


[3/3] commons-compress git commit: COMPRESS-445 try to get compressed count for all supported methods

Posted by bo...@apache.org.
COMPRESS-445 try to get compressed count for all supported methods


Project: http://git-wip-us.apache.org/repos/asf/commons-compress/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-compress/commit/0646aa7d
Tree: http://git-wip-us.apache.org/repos/asf/commons-compress/tree/0646aa7d
Diff: http://git-wip-us.apache.org/repos/asf/commons-compress/diff/0646aa7d

Branch: refs/heads/master
Commit: 0646aa7d4d0ece484e26e8ab262265cc9263c350
Parents: 22c79b2
Author: Stefan Bodewig <bo...@apache.org>
Authored: Sun Apr 22 18:20:29 2018 +0200
Committer: Stefan Bodewig <bo...@apache.org>
Committed: Sun Apr 22 18:20:29 2018 +0200

----------------------------------------------------------------------
 .../archivers/zip/ZipArchiveInputStream.java    | 25 +++++++++++++++++---
 1 file changed, 22 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-compress/blob/0646aa7d/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java
----------------------------------------------------------------------
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 12009b0..f1789f6 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
@@ -472,12 +472,31 @@ public class ZipArchiveInputStream extends ArchiveInputStream implements InputSt
         return read;
     }
 
+    /**
+     * @since 1.17
+     */
     @Override
     public long getCompressedCount() {
-        final long infBytes = inf.getBytesRead();
-        return (infBytes > 0) ? infBytes : current.bytesReadFromStream;
+        if (current.entry.getMethod() == ZipArchiveOutputStream.STORED) {
+            return current.bytesReadFromStream;
+        } else if (current.entry.getMethod() == ZipArchiveOutputStream.DEFLATED) {
+            return getBytesInflated();
+        } else if (current.entry.getMethod() == ZipMethod.UNSHRINKING.getCode()) {
+            return ((UnshrinkingInputStream) current.in).getCompressedCount();
+        } else if (current.entry.getMethod() == ZipMethod.IMPLODING.getCode()) {
+            return ((ExplodingInputStream) current.in).getCompressedCount();
+        } else if (current.entry.getMethod() == ZipMethod.ENHANCED_DEFLATED.getCode()) {
+            return ((Deflate64CompressorInputStream) current.in).getCompressedCount();
+        } else if (current.entry.getMethod() == ZipMethod.BZIP2.getCode()) {
+            return ((BZip2CompressorInputStream) current.in).getCompressedCount();
+        } else {
+            return -1;
+        }
     }
 
+    /**
+     * @since 1.17
+     */
     @Override
     public long getUncompressedCount() {
         return uncompressedCount;
@@ -1096,7 +1115,7 @@ public class ZipArchiveInputStream extends ArchiveInputStream implements InputSt
         private long bytesRead;
 
         /**
-         * Number of bytes of entry content read so from the stream.
+         * Number of bytes of entry content read from the stream.
          *
          * <p>This may be more than the actual entry's length as some
          * stuff gets buffered up and needs to be pushed back when the