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 2014/08/21 20:39:19 UTC

svn commit: r1619505 - in /commons/proper/compress/trunk/src: changes/ main/java/org/apache/commons/compress/archivers/sevenz/

Author: bodewig
Date: Thu Aug 21 18:39:19 2014
New Revision: 1619505

URL: http://svn.apache.org/r1619505
Log:
COMPRESS-286 tell LZMAInputStream the amount of data to expect

Modified:
    commons/proper/compress/trunk/src/changes/changes.xml
    commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/AES256SHA256Decoder.java
    commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/CoderBase.java
    commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/Coders.java
    commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/DeltaDecoder.java
    commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/Folder.java
    commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/LZMA2Decoder.java
    commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java

Modified: commons/proper/compress/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/changes/changes.xml?rev=1619505&r1=1619504&r2=1619505&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/changes/changes.xml (original)
+++ commons/proper/compress/trunk/src/changes/changes.xml Thu Aug 21 18:39:19 2014
@@ -52,6 +52,10 @@ The <action> type attribute can be add,u
         When reading 7z files unknown file properties and properties
         of type kDummy are now ignored.
       </action>
+      <action type="fix" date="2014-08-21" issue="COMPRESS-286">
+        Expanding 7z archives using LZMA compression could cause an
+        EOFException.
+      </action>
     </release>
 
     <release version="1.8.1" date="2014-05-14"

Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/AES256SHA256Decoder.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/AES256SHA256Decoder.java?rev=1619505&r1=1619504&r2=1619505&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/AES256SHA256Decoder.java (original)
+++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/AES256SHA256Decoder.java Thu Aug 21 18:39:19 2014
@@ -30,7 +30,8 @@ import javax.crypto.spec.SecretKeySpec;
 
 class AES256SHA256Decoder extends CoderBase {
     @Override
-    InputStream decode(final InputStream in, final Coder coder, final byte[] passwordBytes) throws IOException {
+    InputStream decode(final InputStream in, long uncompressedLength,
+            final Coder coder, final byte[] passwordBytes) throws IOException {
         return new InputStream() {
             private boolean isInitialized = false;
             private CipherInputStream cipherInputStream = null;

Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/CoderBase.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/CoderBase.java?rev=1619505&r1=1619504&r2=1619505&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/CoderBase.java (original)
+++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/CoderBase.java Thu Aug 21 18:39:19 2014
@@ -64,7 +64,8 @@ abstract class CoderBase {
     /**
      * @return a stream that reads from in using the configured coder and password.
      */
-    abstract InputStream decode(final InputStream in, final Coder coder, byte[] password) throws IOException;
+    abstract InputStream decode(final InputStream in, long uncomressedLength,
+        final Coder coder, byte[] password) throws IOException;
 
     /**
      * @return a stream that writes to out using the given configuration.

Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/Coders.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/Coders.java?rev=1619505&r1=1619504&r2=1619505&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/Coders.java (original)
+++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/Coders.java Thu Aug 21 18:39:19 2014
@@ -67,14 +67,14 @@ class Coders {
         return CODER_MAP.get(method);
     }
 
-    static InputStream addDecoder(final InputStream is,
+    static InputStream addDecoder(final InputStream is, long uncompressedLength,
             final Coder coder, final byte[] password) throws IOException {
         CoderBase cb = findByMethod(SevenZMethod.byId(coder.decompressionMethodId));
         if (cb == null) {
             throw new IOException("Unsupported compression method " +
                                   Arrays.toString(coder.decompressionMethodId));
         }
-        return cb.decode(is, coder, password);
+        return cb.decode(is, uncompressedLength, coder, password);
     }
     
     static OutputStream addEncoder(final OutputStream out, final SevenZMethod method,
@@ -88,8 +88,8 @@ class Coders {
 
     static class CopyDecoder extends CoderBase {
         @Override
-        InputStream decode(final InputStream in, final Coder coder,
-                byte[] password) throws IOException {
+        InputStream decode(final InputStream in, long uncompressedLength,
+                final Coder coder, byte[] password) throws IOException {
             return in; 
         }
         @Override
@@ -100,8 +100,8 @@ class Coders {
 
     static class LZMADecoder extends CoderBase {
         @Override
-        InputStream decode(final InputStream in, final Coder coder,
-                byte[] password) throws IOException {
+        InputStream decode(final InputStream in, long uncompressedLength,
+                final Coder coder, byte[] password) throws IOException {
             byte propsByte = coder.properties[0];
             long dictSize = coder.properties[1];
             for (int i = 1; i < 4; i++) {
@@ -110,7 +110,7 @@ class Coders {
             if (dictSize > LZMAInputStream.DICT_SIZE_MAX) {
                 throw new IOException("Dictionary larger than 4GiB maximum size");
             }
-            return new LZMAInputStream(in, -1, propsByte, (int) dictSize);
+            return new LZMAInputStream(in, uncompressedLength, propsByte, (int) dictSize);
         }
     }
     
@@ -121,8 +121,8 @@ class Coders {
         }
 
         @Override
-        InputStream decode(final InputStream in, final Coder coder,
-                byte[] password) throws IOException {
+        InputStream decode(final InputStream in, long uncompressedLength,
+                final Coder coder, byte[] password) throws IOException {
             try {
                 return opts.getInputStream(in);
             } catch (AssertionError e) {
@@ -149,7 +149,8 @@ class Coders {
         }
 
         @Override
-        InputStream decode(final InputStream in, final Coder coder, final byte[] password)
+        InputStream decode(final InputStream in, long uncompressedLength,
+                final Coder coder, final byte[] password)
             throws IOException {
             return new InflaterInputStream(new DummyByteAddingInputStream(in),
                                            new Inflater(true));
@@ -167,7 +168,8 @@ class Coders {
         }
 
         @Override
-        InputStream decode(final InputStream in, final Coder coder, final byte[] password)
+        InputStream decode(final InputStream in, long uncompressedLength,
+                final Coder coder, final byte[] password)
                 throws IOException {
             return new BZip2CompressorInputStream(in);
         }

Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/DeltaDecoder.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/DeltaDecoder.java?rev=1619505&r1=1619504&r2=1619505&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/DeltaDecoder.java (original)
+++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/DeltaDecoder.java Thu Aug 21 18:39:19 2014
@@ -30,7 +30,8 @@ class DeltaDecoder extends CoderBase {
     }
 
     @Override
-    InputStream decode(final InputStream in, final Coder coder, byte[] password) throws IOException {
+    InputStream decode(final InputStream in, long uncompressedLength,
+            final Coder coder, byte[] password) throws IOException {
         return new DeltaOptions(getOptionsFromCoder(coder)).getInputStream(in);
     }
 

Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/Folder.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/Folder.java?rev=1619505&r1=1619504&r2=1619505&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/Folder.java (original)
+++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/Folder.java Thu Aug 21 18:39:19 2014
@@ -92,6 +92,17 @@ class Folder {
         return 0;
     }
 
+    long getUnpackSizeForCoder(Coder coder) {
+        if (coders != null) {
+            for (int i = 0; i < coders.length; i++) {
+                if (coders[i] == coder) {
+                    return unpackSizes[i];
+                }
+            }
+        }
+        return 0;
+    }
+
     @Override
     public String toString() {
         return "Folder with " + coders.length + " coders, " + totalInputStreams

Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/LZMA2Decoder.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/LZMA2Decoder.java?rev=1619505&r1=1619504&r2=1619505&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/LZMA2Decoder.java (original)
+++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/LZMA2Decoder.java Thu Aug 21 18:39:19 2014
@@ -32,7 +32,8 @@ class LZMA2Decoder extends CoderBase {
     }
 
     @Override
-    InputStream decode(final InputStream in, final Coder coder, byte[] password) throws IOException {
+    InputStream decode(final InputStream in, long uncompressedLength,
+            final Coder coder, byte[] password) throws IOException {
         try {
             int dictionarySize = getDictionarySize(coder);
             return new LZMA2InputStream(in, dictionarySize);

Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java?rev=1619505&r1=1619504&r2=1619505&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java (original)
+++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java Thu Aug 21 18:39:19 2014
@@ -276,7 +276,8 @@ public class SevenZFile implements Close
             if (coder.numInStreams != 1 || coder.numOutStreams != 1) {
                 throw new IOException("Multi input/output stream coders are not yet supported");
             }
-            inputStreamStack = Coders.addDecoder(inputStreamStack, coder, password);
+            inputStreamStack = Coders.addDecoder(inputStreamStack, folder.getUnpackSizeForCoder(coder),
+                    coder, password);
         }
         if (folder.hasCrc) {
             inputStreamStack = new CRC32VerifyingInputStream(inputStreamStack,
@@ -858,7 +859,8 @@ public class SevenZFile implements Close
                 throw new IOException("Multi input/output stream coders are not yet supported");
             }
             SevenZMethod method = SevenZMethod.byId(coder.decompressionMethodId);
-            inputStreamStack = Coders.addDecoder(inputStreamStack, coder, password);
+            inputStreamStack = Coders.addDecoder(inputStreamStack, folder.getUnpackSizeForCoder(coder),
+                    coder, password);
             methods.addFirst(new SevenZMethodConfiguration(method,
                      Coders.findByMethod(method).getOptionsFromCoder(coder, inputStreamStack)));
         }