Merge "Remove support for duplicate file entries." into jb-dev
diff --git a/luni/src/main/java/java/util/zip/ZipFile.java b/luni/src/main/java/java/util/zip/ZipFile.java
index 363f57e..9b552a3 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 @@
         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.ZipInputStream;
 import java.util.zip.ZipOutputStream;
 import junit.framework.TestCase;
+import libcore.io.IoUtils;
 
 public final class ZipFileTest extends TestCase {
 
@@ -54,6 +57,67 @@
         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];