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