From e73a7f649f3e8832adf12a17cd57b06f15b95fcd Mon Sep 17 00:00:00 2001 From: Stefan Bodewig Date: Fri, 30 Jan 2009 15:00:21 +0000 Subject: [PATCH] Ignore ZIP extra fields that don't contain the recommended header+length structure - this is what unzip does as well. PR 42940 git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@739300 13f79535-47bb-0310-9956-ffa450edef68 --- WHATSNEW | 4 ++++ .../org/apache/tools/zip/ExtraFieldUtils.java | 4 ---- src/main/org/apache/tools/zip/ZipEntry.java | 2 +- .../org/apache/tools/zip/ZipExtraField.java | 2 +- src/tests/antunit/taskdefs/unzip-test.xml | 10 ++++++++++ .../antunit/taskdefs/zip/Bugzilla-46559.zip | Bin 10930 -> 10930 bytes .../apache/tools/zip/ExtraFieldUtilsTest.java | 4 ++-- 7 files changed, 18 insertions(+), 8 deletions(-) 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 2f7566082c17042d11f03aa509b6de2402731e0c..711402b6d79a4c642cf35001417c06c5634267c1 100644 GIT binary patch delta 14 VcmdlKx+!#m6f-*m%SPF$S^y<*1XKV3 delta 14 VcmdlKx+!#m6f-9S(?;2;S^y<<1XKV3 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];