Author: bodewig Date: Sat Aug 22 19:01:32 2015 New Revision: 1697106 URL: http://svn.apache.org/r1697106 Log: COMPRESS-321 X7875_NewUnix doesn't handle centra directory correctly
Modified: commons/proper/compress/trunk/src/changes/changes.xml commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/X7875_NewUnix.java commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/X7875_NewUnixTest.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=1697106&r1=1697105&r2=1697106&view=diff ============================================================================== --- commons/proper/compress/trunk/src/changes/changes.xml (original) +++ commons/proper/compress/trunk/src/changes/changes.xml Sat Aug 22 19:01:32 2015 @@ -44,6 +44,10 @@ The <action> type attribute can be add,u <body> <release version="1.11" date="not released, yet" description="Release 1.11"> + <action issue="COMPRESS-321" type="fix" date="2015-08-22"> + ArrayIndexOutOfBoundsException when InfoZIP type 7875 extra + fields are read from the central directory. + </action> </release> <release version="1.10" date="2015-08-18" Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/X7875_NewUnix.java URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/X7875_NewUnix.java?rev=1697106&r1=1697105&r2=1697106&view=diff ============================================================================== --- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/X7875_NewUnix.java (original) +++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/X7875_NewUnix.java Sat Aug 22 19:01:32 2015 @@ -32,6 +32,8 @@ import static org.apache.commons.compres * zip-3.0.tar.gz/proginfo/extrafld.txt * * <pre> + * Local-header version: + * * Value Size Description * ----- ---- ----------- * 0x7875 Short tag for this extra block type ("ux") @@ -41,11 +43,19 @@ import static org.apache.commons.compres * UID Variable UID for this entry (little endian) * GIDSize 1 byte Size of GID field * GID Variable GID for this entry (little endian) + * + * Central-header version: + * + * Value Size Description + * ----- ---- ----------- + * 0x7855 Short tag for this extra block type ("Ux") + * TSize Short total data size for this block (0) * </pre> * @since 1.5 */ public class X7875_NewUnix implements ZipExtraField, Cloneable, Serializable { private static final ZipShort HEADER_ID = new ZipShort(0x7875); + private static final ZipShort ZERO = new ZipShort(0); private static final BigInteger ONE_THOUSAND = BigInteger.valueOf(1000); private static final long serialVersionUID = 1L; @@ -134,7 +144,7 @@ public class X7875_NewUnix implements Zi * @return a <code>ZipShort</code> for the length of the data of this extra field */ public ZipShort getCentralDirectoryLength() { - return getLocalFileDataLength(); // No different than local version. + return ZERO; } /** @@ -181,7 +191,7 @@ public class X7875_NewUnix implements Zi * @return get the data */ public byte[] getCentralDirectoryData() { - return getLocalFileDataData(); + return new byte[0]; } /** @@ -210,14 +220,12 @@ public class X7875_NewUnix implements Zi } /** - * Doesn't do anything special since this class always uses the - * same data in central directory and local file data. + * Doesn't do anything since this class doesn't store anything + * inside the central directory. */ public void parseFromCentralDirectoryData( byte[] buffer, int offset, int length ) throws ZipException { - reset(); - parseFromLocalFileData(buffer, offset, length); } /** Modified: commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/X7875_NewUnixTest.java URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/X7875_NewUnixTest.java?rev=1697106&r1=1697105&r2=1697106&view=diff ============================================================================== --- commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/X7875_NewUnixTest.java (original) +++ commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/X7875_NewUnixTest.java Sat Aug 22 19:01:32 2015 @@ -27,6 +27,7 @@ import java.util.Enumeration; import java.util.zip.ZipException; import static org.apache.commons.compress.AbstractTestCase.getFile; +import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -207,13 +208,6 @@ public class X7875_NewUnixTest { assertEquals(expectedUID, xf.getUID()); assertEquals(expectedGID, xf.getGID()); - // Initial central parse (init with garbage to avoid defaults causing test to pass). - xf.setUID(54321); - xf.setGID(12345); - xf.parseFromCentralDirectoryData(expected, 0, expected.length); - assertEquals(expectedUID, xf.getUID()); - assertEquals(expectedGID, xf.getGID()); - xf.setUID(uid); xf.setGID(gid); if (expected.length < 5) { @@ -239,22 +233,9 @@ public class X7875_NewUnixTest { assertEquals(expectedUID, xf.getUID()); assertEquals(expectedGID, xf.getGID()); - // Do the same as above, but with Central Directory data: - xf.setUID(uid); - xf.setGID(gid); - if (expected.length < 5) { - // We never emit zero-length entries. - assertEquals(5, xf.getCentralDirectoryLength().getValue()); - } else { - assertEquals(expected.length, xf.getCentralDirectoryLength().getValue()); - } + assertEquals(0, xf.getCentralDirectoryLength().getValue()); result = xf.getCentralDirectoryData(); - if (expected.length < 5) { - // We never emit zero-length entries. - assertTrue(Arrays.equals(new byte[]{1,1,0,1,0}, result)); - } else { - assertTrue(Arrays.equals(expected, result)); - } + assertArrayEquals(new byte[0], result); // And now we re-parse: xf.parseFromCentralDirectoryData(result, 0, result.length);