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/01/05 12:32:30 UTC
[1/3] commons-compress git commit: the list of supported methods has
grown by now
Repository: commons-compress
Updated Branches:
refs/heads/COMPRESS-380 334f1de9a -> 27b16a262
the list of supported methods has grown by now
Project: http://git-wip-us.apache.org/repos/asf/commons-compress/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-compress/commit/5d0b71fe
Tree: http://git-wip-us.apache.org/repos/asf/commons-compress/tree/5d0b71fe
Diff: http://git-wip-us.apache.org/repos/asf/commons-compress/diff/5d0b71fe
Branch: refs/heads/COMPRESS-380
Commit: 5d0b71fe9c3ab81717245f80eb71840f9a22a5aa
Parents: 334f1de
Author: Stefan Bodewig <bo...@apache.org>
Authored: Fri Jan 5 12:49:21 2018 +0100
Committer: Stefan Bodewig <bo...@apache.org>
Committed: Fri Jan 5 12:49:21 2018 +0100
----------------------------------------------------------------------
.../java/org/apache/commons/compress/archivers/zip/ZipUtil.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/commons-compress/blob/5d0b71fe/src/main/java/org/apache/commons/compress/archivers/zip/ZipUtil.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/compress/archivers/zip/ZipUtil.java b/src/main/java/org/apache/commons/compress/archivers/zip/ZipUtil.java
index d22a62e..677ac3f 100644
--- a/src/main/java/org/apache/commons/compress/archivers/zip/ZipUtil.java
+++ b/src/main/java/org/apache/commons/compress/archivers/zip/ZipUtil.java
@@ -324,7 +324,7 @@ public abstract class ZipUtil {
* Whether this library supports the compression method used by
* the given entry.
*
- * @return true if the compression method is STORED or DEFLATED
+ * @return true if the compression method is supported
*/
private static boolean supportsMethodOf(final ZipArchiveEntry entry) {
return entry.getMethod() == ZipEntry.STORED
[3/3] commons-compress git commit: COMPRESS-380 support data
descriptors with ENHANCED_DEFLATED
Posted by bo...@apache.org.
COMPRESS-380 support data descriptors with ENHANCED_DEFLATED
Project: http://git-wip-us.apache.org/repos/asf/commons-compress/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-compress/commit/27b16a26
Tree: http://git-wip-us.apache.org/repos/asf/commons-compress/tree/27b16a26
Diff: http://git-wip-us.apache.org/repos/asf/commons-compress/diff/27b16a26
Branch: refs/heads/COMPRESS-380
Commit: 27b16a26212d5e4b61ebe07c4bd9c36465f56702
Parents: aed74ea
Author: Stefan Bodewig <bo...@apache.org>
Authored: Fri Jan 5 13:31:23 2018 +0100
Committer: Stefan Bodewig <bo...@apache.org>
Committed: Fri Jan 5 13:31:23 2018 +0100
----------------------------------------------------------------------
.../archivers/zip/ZipArchiveInputStream.java | 39 +++++++++++++------
.../zip/ZipArchiveInputStreamTest.java | 19 +++++++++
src/test/resources/COMPRESS-380-dd.zip | Bin 0 -> 1391 bytes
3 files changed, 46 insertions(+), 12 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/commons-compress/blob/27b16a26/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 ea2b34f..30ccdf3 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
@@ -313,21 +313,35 @@ public class ZipArchiveInputStream extends ArchiveInputStream {
current.entry.setDataOffset(getBytesRead());
current.entry.setStreamContiguous(true);
+ ZipMethod m = ZipMethod.getMethodByCode(current.entry.getMethod());
if (current.entry.getCompressedSize() != ArchiveEntry.SIZE_UNKNOWN) {
- // FIXME this currently leaks bis if the method is not one of the supported ones
- InputStream bis = new BoundedInputStream(in, current.entry.getCompressedSize());
- if (current.entry.getMethod() == ZipMethod.UNSHRINKING.getCode()) {
- current.in = new UnshrinkingInputStream(bis);
- } else if (current.entry.getMethod() == ZipMethod.IMPLODING.getCode()) {
- current.in = new ExplodingInputStream(
+ if (ZipUtil.canHandleEntryData(current.entry) && m != ZipMethod.STORED && m != ZipMethod.DEFLATED) {
+ InputStream bis = new BoundedInputStream(in, current.entry.getCompressedSize());
+ switch (m) {
+ case UNSHRINKING:
+ current.in = new UnshrinkingInputStream(bis);
+ break;
+ case IMPLODING:
+ current.in = new ExplodingInputStream(
current.entry.getGeneralPurposeBit().getSlidingDictionarySize(),
current.entry.getGeneralPurposeBit().getNumberOfShannonFanoTrees(),
bis);
- } else if (current.entry.getMethod() == ZipMethod.BZIP2.getCode()) {
- current.in = new BZip2CompressorInputStream(bis);
- } else if (current.entry.getMethod() == ZipMethod.ENHANCED_DEFLATED.getCode()) {
- current.in = new Deflate64CompressorInputStream(bis);
+ break;
+ case BZIP2:
+ current.in = new BZip2CompressorInputStream(bis);
+ break;
+ case ENHANCED_DEFLATED:
+ current.in = new Deflate64CompressorInputStream(bis);
+ break;
+ default:
+ // we should never get here as all supported methods have been covered
+ // will cause an error when read is invoked, don't throw an exception here so people can
+ // skip unsupported entries
+ break;
+ }
}
+ } else if (m == ZipMethod.ENHANCED_DEFLATED) {
+ current.in = new Deflate64CompressorInputStream(in);
}
entriesRead++;
@@ -776,13 +790,14 @@ public class ZipArchiveInputStream extends ArchiveInputStream {
*
* @return true if allowStoredEntriesWithDataDescriptor is true,
* the entry doesn't require any data descriptor or the method is
- * DEFLATED.
+ * DEFLATED or ENHANCED_DEFLATED.
*/
private boolean supportsDataDescriptorFor(final ZipArchiveEntry entry) {
return !entry.getGeneralPurposeBit().usesDataDescriptor()
|| (allowStoredEntriesWithDataDescriptor && entry.getMethod() == ZipEntry.STORED)
- || entry.getMethod() == ZipEntry.DEFLATED;
+ || entry.getMethod() == ZipEntry.DEFLATED
+ || entry.getMethod() == ZipMethod.ENHANCED_DEFLATED.getCode();
}
/**
http://git-wip-us.apache.org/repos/asf/commons-compress/blob/27b16a26/src/test/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStreamTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStreamTest.java b/src/test/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStreamTest.java
index 3bb62d5..04269ad 100644
--- a/src/test/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStreamTest.java
+++ b/src/test/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStreamTest.java
@@ -221,6 +221,25 @@ public class ZipArchiveInputStreamTest {
}
}
+ @Test
+ public void readDeflate64CompressedStreamWithDataDescriptor() throws Exception {
+ // this is a copy of bla.jar with META-INF/MANIFEST.MF's method manually changed to ENHANCED_DEFLATED
+ final File archive = getFile("COMPRESS-380-dd.zip");
+ try (ZipArchiveInputStream zin = new ZipArchiveInputStream(new FileInputStream(archive))) {
+ ZipArchiveEntry e = zin.getNextZipEntry();
+ assertEquals(-1, e.getSize());
+ assertEquals(ZipMethod.ENHANCED_DEFLATED.getCode(), e.getMethod());
+ byte[] fromZip = IOUtils.toByteArray(zin);
+ byte[] expected = new byte[] {
+ 'M', 'a', 'n', 'i', 'f', 'e', 's', 't', '-', 'V', 'e', 'r', 's', 'i', 'o', 'n', ':', ' ', '1', '.', '0',
+ '\r', '\n', '\r', '\n'
+ };
+ assertArrayEquals(expected, fromZip);
+ zin.getNextZipEntry();
+ assertEquals(25, e.getSize());
+ }
+ }
+
/**
* Test case for
* <a href="https://issues.apache.org/jira/browse/COMPRESS-364"
http://git-wip-us.apache.org/repos/asf/commons-compress/blob/27b16a26/src/test/resources/COMPRESS-380-dd.zip
----------------------------------------------------------------------
diff --git a/src/test/resources/COMPRESS-380-dd.zip b/src/test/resources/COMPRESS-380-dd.zip
new file mode 100644
index 0000000..9557996
Binary files /dev/null and b/src/test/resources/COMPRESS-380-dd.zip differ
[2/3] commons-compress git commit: COMPRESS-380 allow underlying
stream to outlive HuffmanDecoder
Posted by bo...@apache.org.
COMPRESS-380 allow underlying stream to outlive HuffmanDecoder
Project: http://git-wip-us.apache.org/repos/asf/commons-compress/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-compress/commit/aed74ea0
Tree: http://git-wip-us.apache.org/repos/asf/commons-compress/tree/aed74ea0
Diff: http://git-wip-us.apache.org/repos/asf/commons-compress/diff/aed74ea0
Branch: refs/heads/COMPRESS-380
Commit: aed74ea03276362cd301a36787774843ebd4f70c
Parents: 5d0b71f
Author: Stefan Bodewig <bo...@apache.org>
Authored: Fri Jan 5 13:29:40 2018 +0100
Committer: Stefan Bodewig <bo...@apache.org>
Committed: Fri Jan 5 13:29:40 2018 +0100
----------------------------------------------------------------------
.../deflate64/Deflate64CompressorInputStream.java | 12 +++++++++++-
.../compress/compressors/deflate64/HuffmanDecoder.java | 3 +--
2 files changed, 12 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/commons-compress/blob/aed74ea0/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 88b2142..369fa8d 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
@@ -29,6 +29,7 @@ import static org.apache.commons.compress.utils.IOUtils.closeQuietly;
* @since 1.16
*/
public class Deflate64CompressorInputStream extends CompressorInputStream {
+ private InputStream originalStream;
private HuffmanDecoder decoder;
/**
@@ -38,6 +39,7 @@ public class Deflate64CompressorInputStream extends CompressorInputStream {
*/
public Deflate64CompressorInputStream(InputStream in) {
this(new HuffmanDecoder(in));
+ originalStream = in;
}
Deflate64CompressorInputStream(HuffmanDecoder decoder) {
@@ -75,7 +77,7 @@ public class Deflate64CompressorInputStream extends CompressorInputStream {
read = decoder.decode(b, off, len);
count(read);
if (read == -1) {
- close();
+ closeDecoder();
}
}
return read;
@@ -88,6 +90,14 @@ public class Deflate64CompressorInputStream extends CompressorInputStream {
@Override
public void close() throws IOException {
+ closeDecoder();
+ if (originalStream != null) {
+ originalStream.close();
+ originalStream = null;
+ }
+ }
+
+ private void closeDecoder() throws IOException {
closeQuietly(decoder);
decoder = null;
}
http://git-wip-us.apache.org/repos/asf/commons-compress/blob/aed74ea0/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 04ec7f9..f74c7de 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
@@ -27,7 +27,6 @@ import java.nio.ByteOrder;
import java.util.Arrays;
import static org.apache.commons.compress.compressors.deflate64.HuffmanState.*;
-import static org.apache.commons.compress.utils.IOUtils.closeQuietly;
class HuffmanDecoder implements Closeable {
/**
@@ -119,7 +118,7 @@ class HuffmanDecoder implements Closeable {
@Override
public void close() {
- closeQuietly(reader);
+ state = new InitialState();
reader = null;
}