diff options
author | Geremy Condra <gcondra@google.com> | 2013-02-18 19:05:14 -0800 |
---|---|---|
committer | Steve Kondik <shade@chemlab.org> | 2013-07-07 11:18:56 -0700 |
commit | fe70e697810a7a8b9ce47325f53d16fdbc19f1f8 (patch) | |
tree | 115d97eae9ce9f81fa78be6d1d93b6ad6c4cd2de | |
parent | 8a22bed790b6699fc5e52c7d796b556ef92ecb9c (diff) | |
download | libcore-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.java | 5 | ||||
-rw-r--r-- | luni/src/test/java/libcore/java/util/zip/ZipFileTest.java | 64 |
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]; |