diff options
-rw-r--r-- | archive/src/main/java/java/util/jar/JarFile.java | 25 | ||||
-rw-r--r-- | archive/src/test/java/org/apache/harmony/archive/tests/java/util/jar/JarFileTest.java | 52 | ||||
-rw-r--r-- | support/src/test/java/tests/resources/EmptyEntries_signed.jar | bin | 0 -> 1927 bytes |
3 files changed, 67 insertions, 10 deletions
diff --git a/archive/src/main/java/java/util/jar/JarFile.java b/archive/src/main/java/java/util/jar/JarFile.java index d6e8339..6f4eb83 100644 --- a/archive/src/main/java/java/util/jar/JarFile.java +++ b/archive/src/main/java/java/util/jar/JarFile.java @@ -68,6 +68,10 @@ public class JarFile extends ZipFile { private JarVerifier.VerifierEntry entry; + // BEGIN android-added + private boolean done = false; + // END android-added + JarFileInputStream(InputStream is, ZipEntry ze, JarVerifier.VerifierEntry e) { super(is); @@ -78,6 +82,10 @@ public class JarFile extends ZipFile { @Override public int read() throws IOException { + // BEGIN android-changed + if (done) { + return -1; + } if (count > 0) { int r = super.read(); if (r != -1) { @@ -87,16 +95,24 @@ public class JarFile extends ZipFile { count = 0; } if (count == 0) { + done = true; entry.verify(); } return r; } else { + done = true; + entry.verify(); return -1; } + // END android-changed } @Override public int read(byte[] buf, int off, int nbytes) throws IOException { + // BEGIN android-changed + if (done) { + return -1; + } if (count > 0) { int r = super.read(buf, off, nbytes); if (r != -1) { @@ -110,22 +126,25 @@ public class JarFile extends ZipFile { count = 0; } if (count == 0) { + done = true; entry.verify(); } return r; } else { + done = true; + entry.verify(); return -1; } + // END android-changed } // BEGIN android-added @Override public int available() throws IOException { - if (count > 0) { - return super.available(); - } else { + if (done) { return 0; } + return super.available(); } // END android-added diff --git a/archive/src/test/java/org/apache/harmony/archive/tests/java/util/jar/JarFileTest.java b/archive/src/test/java/org/apache/harmony/archive/tests/java/util/jar/JarFileTest.java index 96321a4..d2a5110 100644 --- a/archive/src/test/java/org/apache/harmony/archive/tests/java/util/jar/JarFileTest.java +++ b/archive/src/test/java/org/apache/harmony/archive/tests/java/util/jar/JarFileTest.java @@ -18,10 +18,15 @@ package org.apache.harmony.archive.tests.java.util.jar; import dalvik.annotation.AndroidOnly; -import dalvik.annotation.TestTargetClass; import dalvik.annotation.TestLevel; +import dalvik.annotation.TestTargetClass; import dalvik.annotation.TestTargetNew; +import junit.framework.TestCase; + +import tests.support.Support_PlatformFile; +import tests.support.resource.Support_Resources; + import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; @@ -41,10 +46,6 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipException; import java.util.zip.ZipFile; -import junit.framework.TestCase; -import tests.support.Support_PlatformFile; -import tests.support.resource.Support_Resources; - @TestTargetClass(JarFile.class) public class JarFileTest extends TestCase { @@ -74,14 +75,22 @@ public class JarFileTest extends TestCase { private final String jarName5 = "hyts_signed_inc.jar"; - private final String integrateJar = "Integrate.jar"; - private final String entryName = "foo/bar/A.class"; private final String entryName3 = "coucou/FileAccess.class"; + private final String integrateJar = "Integrate.jar"; + private final String integrateJarEntry = "Test.class"; + private final String emptyEntryJar = "EmptyEntries_signed.jar"; + + private final String emptyEntry1 = "subfolder/internalSubset01.js"; + + private final String emptyEntry2 = "svgtest.js"; + + private final String emptyEntry3 = "svgunit.js"; + private File resources; // custom security manager @@ -1061,4 +1070,33 @@ public class JarFileTest extends TestCase { // expected } } + + /** + * The jar is intact, but the entry object is modified. + */ + @TestTargetNew( + level = TestLevel.PARTIAL_COMPLETE, + notes = "Regression test for issue introduced by HAROMNY-4569. " + + "signed archives containing files with size 0 could not get verified", + method = "getInputStream", + args = {ZipEntry.class} + ) + public void testJarVerificationEmptyEntry() throws IOException { + Support_Resources.copyFile(resources, null, emptyEntryJar); + File f = new File(resources, emptyEntryJar); + + JarFile jarFile = new JarFile(f); + + ZipEntry zipEntry = jarFile.getJarEntry(emptyEntry1); + int res = jarFile.getInputStream(zipEntry).read(new byte[100], 0, 100); + assertEquals("Wrong length of empty jar entry", -1, res); + + zipEntry = jarFile.getJarEntry(emptyEntry2); + res = jarFile.getInputStream(zipEntry).read(new byte[100], 0, 100); + assertEquals("Wrong length of empty jar entry", -1, res); + + zipEntry = jarFile.getJarEntry(emptyEntry3); + res = jarFile.getInputStream(zipEntry).read(); + assertEquals("Wrong length of empty jar entry", -1, res); + } } diff --git a/support/src/test/java/tests/resources/EmptyEntries_signed.jar b/support/src/test/java/tests/resources/EmptyEntries_signed.jar Binary files differnew file mode 100644 index 0000000..237d244 --- /dev/null +++ b/support/src/test/java/tests/resources/EmptyEntries_signed.jar |