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