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 2013/01/01 11:51:42 UTC
svn commit: r1427353 - in
/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip:
UnsupportedZipFeatureException.java ZipArchiveInputStream.java ZipLong.java
Author: bodewig
Date: Tue Jan 1 10:51:42 2013
New Revision: 1427353
URL: http://svn.apache.org/viewvc?rev=1427353&view=rev
Log:
explicitly fail when ZipArchiveInputStream reads a split/spanned archive
Modified:
commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/UnsupportedZipFeatureException.java
commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java
commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipLong.java
Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/UnsupportedZipFeatureException.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/UnsupportedZipFeatureException.java?rev=1427353&r1=1427352&r2=1427353&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/UnsupportedZipFeatureException.java (original)
+++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/UnsupportedZipFeatureException.java Tue Jan 1 10:51:42 2013
@@ -29,7 +29,7 @@ public class UnsupportedZipFeatureExcept
private final Feature reason;
private final ZipArchiveEntry entry;
- private static final long serialVersionUID = 4430521921766595597L;
+ private static final long serialVersionUID = 20130101L;
/**
* Creates an exception.
@@ -60,6 +60,18 @@ public class UnsupportedZipFeatureExcept
}
/**
+ * Creates an exception when the whole archive uses an unsupported
+ * feature.
+ *
+ * @param reason the feature that is not supported
+ */
+ public UnsupportedZipFeatureException(Feature reason) {
+ super("unsupported feature " + reason + " used in archive.");
+ this.reason = reason;
+ this.entry = null;
+ }
+
+ /**
* The unsupported feature that has been used.
*/
public Feature getFeature() {
@@ -90,6 +102,11 @@ public class UnsupportedZipFeatureExcept
* The entry uses a data descriptor.
*/
public static final Feature DATA_DESCRIPTOR = new Feature("data descriptor");
+ /**
+ * The archive uses splitting or spanning.
+ * @since 1.5
+ */
+ public static final Feature SPLITTING = new Feature("splitting");
private final String name;
Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java?rev=1427353&r1=1427352&r2=1427353&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java (original)
+++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java Tue Jan 1 10:51:42 2013
@@ -174,18 +174,30 @@ public class ZipArchiveInputStream exten
}
public ZipArchiveEntry getNextZipEntry() throws IOException {
+ boolean firstEntry = true;
if (closed || hitCentralDirectory) {
return null;
}
if (current != null) {
closeEntry();
+ firstEntry = false;
}
+
byte[] lfh = new byte[LFH_LEN];
try {
- readFully(lfh);
+ if (firstEntry) {
+ // split archives have a special signature before the
+ // first local file header - look for it and fail with
+ // the appropriate error message if this is a split
+ // archive.
+ readFirstLocalFileHeader(lfh);
+ } else {
+ readFully(lfh);
+ }
} catch (EOFException e) {
return null;
}
+
ZipLong sig = new ZipLong(lfh);
if (sig.equals(ZipLong.CFH_SIG)) {
hitCentralDirectory = true;
@@ -258,6 +270,21 @@ public class ZipArchiveInputStream exten
}
/**
+ * Fills the given array with the first local file header and
+ * deals with splitting/spanning markers that may prefix the first
+ * LFH.
+ */
+ private void readFirstLocalFileHeader(byte[] lfh) throws IOException {
+ readFully(lfh);
+ ZipLong sig = new ZipLong(lfh);
+ if (sig.equals(ZipLong.DD_SIG)) {
+ throw new
+ UnsupportedZipFeatureException(UnsupportedZipFeatureException
+ .Feature.SPLITTING);
+ }
+ }
+
+ /**
* Records whether a Zip64 extra is present and sets the size
* information from it if sizes are 0xFFFFFFFF and the entry
* doesn't use a data descriptor.
Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipLong.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipLong.java?rev=1427353&r1=1427352&r2=1427353&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipLong.java (original)
+++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipLong.java Tue Jan 1 10:51:42 2013
@@ -50,7 +50,11 @@ public final class ZipLong implements Cl
public static final ZipLong LFH_SIG = new ZipLong(0X04034B50L);
/**
- * Data Descriptor signature
+ * Data Descriptor signature.
+ *
+ * <p>Actually, PKWARE uses this as marker for split/spanned
+ * archives and other archivers have started to use it as Data
+ * Descriptor signature (as well).</p>
* @since 1.1
*/
public static final ZipLong DD_SIG = new ZipLong(0X08074B50L);