diff --git a/WHATSNEW b/WHATSNEW
index 09aabe7b8..ecc54180c 100644
--- a/WHATSNEW
+++ b/WHATSNEW
@@ -670,6 +670,10 @@ Other changes:
processor.
Bugzilla Issue 46612.
+ * the ZIP library will now ignore ZIP extra fields that don't specify
+ a size.
+ Bugzilla Report 42940.
+
Changes from Ant 1.7.0 TO Ant 1.7.1
=============================================
diff --git a/src/main/org/apache/tools/zip/ExtraFieldUtils.java b/src/main/org/apache/tools/zip/ExtraFieldUtils.java
index 0aa5cbd11..befd42322 100644
--- a/src/main/org/apache/tools/zip/ExtraFieldUtils.java
+++ b/src/main/org/apache/tools/zip/ExtraFieldUtils.java
@@ -117,10 +117,6 @@ public class ExtraFieldUtils {
}
start += (length + WORD);
}
- if (start != data.length) { // array not exhausted
- throw new ZipException("data starting at " + start
- + " is in unknown format");
- }
ZipExtraField[] result = new ZipExtraField[v.size()];
return (ZipExtraField[]) v.toArray(result);
diff --git a/src/main/org/apache/tools/zip/ZipEntry.java b/src/main/org/apache/tools/zip/ZipEntry.java
index 3223454b9..d1e1deb2c 100644
--- a/src/main/org/apache/tools/zip/ZipEntry.java
+++ b/src/main/org/apache/tools/zip/ZipEntry.java
@@ -252,7 +252,7 @@ public class ZipEntry extends java.util.zip.ZipEntry implements Cloneable {
try {
setExtraFields(ExtraFieldUtils.parse(extra));
} catch (Exception e) {
- throw new RuntimeException(e.getMessage());
+ throw new RuntimeException(e.getMessage(), e);
}
}
diff --git a/src/main/org/apache/tools/zip/ZipExtraField.java b/src/main/org/apache/tools/zip/ZipExtraField.java
index 622ff1738..649fca005 100644
--- a/src/main/org/apache/tools/zip/ZipExtraField.java
+++ b/src/main/org/apache/tools/zip/ZipExtraField.java
@@ -64,7 +64,7 @@ public interface ZipExtraField {
byte[] getLocalFileDataData();
/**
- * The actual data to put central directory - without Header-ID or
+ * The actual data to put into central directory - without Header-ID or
* length specifier.
* @return the data
* @since 1.1
diff --git a/src/tests/antunit/taskdefs/unzip-test.xml b/src/tests/antunit/taskdefs/unzip-test.xml
index ed75de469..45a878f54 100644
--- a/src/tests/antunit/taskdefs/unzip-test.xml
+++ b/src/tests/antunit/taskdefs/unzip-test.xml
@@ -44,6 +44,16 @@
+
+
+
+
+
+
+
+
diff --git a/src/tests/antunit/taskdefs/zip/Bugzilla-46559.zip b/src/tests/antunit/taskdefs/zip/Bugzilla-46559.zip
index 2f7566082..711402b6d 100644
Binary files a/src/tests/antunit/taskdefs/zip/Bugzilla-46559.zip and b/src/tests/antunit/taskdefs/zip/Bugzilla-46559.zip differ
diff --git a/src/tests/junit/org/apache/tools/zip/ExtraFieldUtilsTest.java b/src/tests/junit/org/apache/tools/zip/ExtraFieldUtilsTest.java
index c405138f7..13e07193e 100644
--- a/src/tests/junit/org/apache/tools/zip/ExtraFieldUtilsTest.java
+++ b/src/tests/junit/org/apache/tools/zip/ExtraFieldUtilsTest.java
@@ -40,7 +40,7 @@ public class ExtraFieldUtilsTest extends TestCase implements UnixStat {
a.setDirectory(true);
dummy = new UnrecognizedExtraField();
dummy.setHeaderId(new ZipShort(1));
- dummy.setLocalFileDataData(new byte[0]);
+ dummy.setLocalFileDataData(new byte[] {0});
dummy.setCentralDirectoryData(new byte[] {0});
aLocal = a.getLocalFileDataData();
@@ -68,7 +68,7 @@ public class ExtraFieldUtilsTest extends TestCase implements UnixStat {
assertEquals("mode field 1", 040755,
((AsiExtraField) ze[0]).getMode());
assertTrue("type field 2", ze[1] instanceof UnrecognizedExtraField);
- assertEquals("data length field 2", 0,
+ assertEquals("data length field 2", 1,
ze[1].getLocalFileDataLength().getValue());
byte[] data2 = new byte[data.length-1];