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