summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeremy Condra <gcondra@google.com>2013-02-18 19:05:14 -0800
committerSteve Kondik <shade@chemlab.org>2013-07-07 11:18:56 -0700
commitfe70e697810a7a8b9ce47325f53d16fdbc19f1f8 (patch)
tree115d97eae9ce9f81fa78be6d1d93b6ad6c4cd2de
parent8a22bed790b6699fc5e52c7d796b556ef92ecb9c (diff)
downloadlibcore-fe70e697810a7a8b9ce47325f53d16fdbc19f1f8.zip
libcore-fe70e697810a7a8b9ce47325f53d16fdbc19f1f8.tar.gz
libcore-fe70e697810a7a8b9ce47325f53d16fdbc19f1f8.tar.bz2
Remove support for duplicate file entries
Bug: 8219321 Change-Id: Ibc56bea753917c38e1bb20df48aa45fdff39d364
-rw-r--r--luni/src/main/java/java/util/zip/ZipFile.java5
-rw-r--r--luni/src/test/java/libcore/java/util/zip/ZipFileTest.java64
2 files changed, 68 insertions, 1 deletions
diff --git a/luni/src/main/java/java/util/zip/ZipFile.java b/luni/src/main/java/java/util/zip/ZipFile.java
index 6ecd489..816d1b8 100644
--- a/luni/src/main/java/java/util/zip/ZipFile.java
+++ b/luni/src/main/java/java/util/zip/ZipFile.java
@@ -363,7 +363,10 @@ public class ZipFile implements ZipConstants {
byte[] hdrBuf = new byte[CENHDR]; // Reuse the same buffer for each entry.
for (int i = 0; i < numEntries; ++i) {
ZipEntry newEntry = new ZipEntry(hdrBuf, bin);
- mEntries.put(newEntry.getName(), newEntry);
+ String entryName = newEntry.getName();
+ if (mEntries.put(entryName, newEntry) != null) {
+ throw new ZipException("Duplicate entry name: " + entryName);
+ }
}
}
diff --git a/luni/src/test/java/libcore/java/util/zip/ZipFileTest.java b/luni/src/test/java/libcore/java/util/zip/ZipFileTest.java
index 7e8286e..afceaba 100644
--- a/luni/src/test/java/libcore/java/util/zip/ZipFileTest.java
+++ b/luni/src/test/java/libcore/java/util/zip/ZipFileTest.java
@@ -17,9 +17,11 @@
package libcore.java.util.zip;
import java.io.BufferedOutputStream;
+import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
+import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
@@ -30,6 +32,7 @@ import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
import junit.framework.TestCase;
+import libcore.io.IoUtils;
public final class ZipFileTest extends TestCase {
@@ -54,6 +57,67 @@ public final class ZipFileTest extends TestCase {
zipFile.close();
}
+ private static void replaceBytes(byte[] original, byte[] replacement, byte[] buffer) {
+ // Gotcha here: original and replacement must be the same length
+ assertEquals(original.length, replacement.length);
+ boolean found;
+ for(int i=0; i < buffer.length - original.length; i++) {
+ found = false;
+ if (buffer[i] == original[0]) {
+ found = true;
+ for (int j=0; j < original.length; j++) {
+ if (buffer[i+j] != original[j]) {
+ found = false;
+ break;
+ }
+ }
+ }
+ if (found) {
+ for (int j=0; j < original.length; j++) {
+ buffer[i+j] = replacement[j];
+ }
+ }
+ }
+ }
+
+ /**
+ * Make sure we don't fail silently for duplicate entries.
+ * b/8219321
+ */
+ public void testDuplicateEntries() throws IOException {
+ String entryName = "test_file_name1";
+ String tmpName = "test_file_name2";
+
+ // create the template data
+ ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
+ ZipOutputStream out = new ZipOutputStream(bytesOut);
+ ZipEntry ze1 = new ZipEntry(tmpName);
+ out.putNextEntry(ze1);
+ out.closeEntry();
+ ZipEntry ze2 = new ZipEntry(entryName);
+ out.putNextEntry(ze2);
+ out.closeEntry();
+ out.close();
+
+ // replace the bytes we don't like
+ byte[] buf = bytesOut.toByteArray();
+ replaceBytes(tmpName.getBytes(), entryName.getBytes(), buf);
+
+ // write the result to a file
+ File badZip = File.createTempFile("badzip", "zip");
+ badZip.deleteOnExit();
+ FileOutputStream outstream = new FileOutputStream(badZip);
+ outstream.write(buf);
+ outstream.close();
+
+ // see if we can still handle it
+ try {
+ ZipFile bad = new ZipFile(badZip);
+ fail();
+ } catch (ZipException expected) {
+ }
+ }
+
public void testInflatingStreamsRequiringZipRefill() throws IOException {
int originalSize = 1024 * 1024;
byte[] readBuffer = new byte[8192];