changeset 12611:db0baea3a4f0 icedtea-3.5.1 icedtea-3.6.0pre01

Merge jdk8u144-b01
author andrew
date Thu, 27 Jul 2017 01:47:51 +0100
parents 987edbcb568f (current diff) d2744852f3e6 (diff)
children 7b1a2f967cd8
files .hgtags test/java/util/zip/ZipFile/ReadZip.java
diffstat 3 files changed, 66 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/.hgtags	Fri Jul 21 05:09:03 2017 +0100
+++ b/.hgtags	Thu Jul 27 01:47:51 2017 +0100
@@ -751,3 +751,5 @@
 c6bc194fedb63b20c45c793405d215d206fb4654 jdk8u141-b13
 d630e23b8e36c2863225d7ae107c73a38d3e6102 jdk8u141-b14
 bdf93656feba13fa1f34d104711bfe7178a2fae1 icedtea-3.5.0
+2ea94405100763c772ab3989200115d7a23c7532 jdk8u141-b15
+b64b1dfdbe7cfe3859f1023c0f1fb0216bce4ae7 jdk8u144-b00
--- a/src/share/classes/java/util/zip/ZipFile.java	Fri Jul 21 05:09:03 2017 +0100
+++ b/src/share/classes/java/util/zip/ZipFile.java	Thu Jul 27 01:47:51 2017 +0100
@@ -90,12 +90,18 @@
 
     private static final boolean usemmap;
 
+    private static final boolean ensuretrailingslash;
+
     static {
         // A system prpperty to disable mmap use to avoid vm crash when
         // in-use zip file is accidently overwritten by others.
         String prop = sun.misc.VM.getSavedProperty("sun.zip.disableMemoryMapping");
         usemmap = (prop == null ||
                    !(prop.length() == 0 || prop.equalsIgnoreCase("true")));
+
+        // see getEntry() for details
+        prop = sun.misc.VM.getSavedProperty("jdk.util.zip.ensureTrailingSlash");
+        ensuretrailingslash = prop == null || !prop.equalsIgnoreCase("false");
     }
 
     /**
@@ -309,7 +315,16 @@
             ensureOpen();
             jzentry = getEntry(jzfile, zc.getBytes(name), true);
             if (jzentry != 0) {
-                ZipEntry ze = getZipEntry(name, jzentry);
+                // If no entry is found for the specified 'name' and
+                // the 'name' does not end with a forward slash '/',
+                // the implementation tries to find the entry with a
+                // slash '/' appended to the end of the 'name', before
+                // returning null. When such entry is found, the name
+                // that actually is found (with a slash '/' attached)
+                // is used
+                // (disabled if jdk.util.zip.ensureTrailingSlash=false)
+                ZipEntry ze = ensuretrailingslash ? getZipEntry(null, jzentry)
+                                                  : getZipEntry(name, jzentry);
                 freeEntry(jzfile, jzentry);
                 return ze;
             }
@@ -560,7 +575,9 @@
             e.name = name;
         } else {
             byte[] bname = getEntryBytes(jzentry, JZENTRY_NAME);
-            if (!zc.isUTF8() && (e.flag & EFS) != 0) {
+            if (bname == null) {
+                e.name = "";             // length 0 empty name
+            } else if (!zc.isUTF8() && (e.flag & EFS) != 0) {
                 e.name = zc.toStringUTF8(bname, bname.length);
             } else {
                 e.name = zc.toString(bname, bname.length);
--- a/test/java/util/zip/ZipFile/ReadZip.java	Fri Jul 21 05:09:03 2017 +0100
+++ b/test/java/util/zip/ZipFile/ReadZip.java	Thu Jul 27 01:47:51 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -22,9 +22,12 @@
  */
 
 /* @test
-   @bug 4241361 4842702 4985614 6646605 5032358 6923692
-   @summary Make sure we can read a zip file.
+ * @bug 4241361 4842702 4985614 6646605 5032358 6923692 6233323 8144977 8184993
+ * @summary Make sure we can read a zip file.
    @key randomness
+ * @run main/othervm ReadZip
+ * @run main/othervm -Djdk.util.zip.ensureTrailingSlash=true ReadZip
+ * @run main/othervm -Djdk.util.zip.ensureTrailingSlash=false ReadZip
  */
 
 import java.io.*;
@@ -104,6 +107,45 @@
             newZip.delete();
         }
 
+        // Read directory entry
+        try {
+            try (FileOutputStream fos = new FileOutputStream(newZip);
+                 ZipOutputStream zos = new ZipOutputStream(fos))
+            {
+                ZipEntry ze = new ZipEntry("directory/");
+                zos.putNextEntry(ze);
+                zos.closeEntry();
+            }
+            try (ZipFile zf = new ZipFile(newZip)) {
+                ZipEntry ze = zf.getEntry("directory/");
+                if (ze == null || !ze.isDirectory())
+                    throw new RuntimeException("read entry \"directory/\" failed");
+                try (InputStream is = zf.getInputStream(ze)) {
+                    is.available();
+                } catch (Exception x) {
+                    x.printStackTrace();
+                }
+
+                ze = zf.getEntry("directory");
+
+                boolean legacyBehavior =
+                    System.getProperty("jdk.util.zip.ensureTrailingSlash", "true")
+                        .equalsIgnoreCase("false");
+
+                if (ze == null || (!legacyBehavior && !ze.isDirectory()))
+                    throw new RuntimeException("read entry \"directory\" failed");
+                try (InputStream is = zf.getInputStream(ze)) {
+                    is.available();
+                } catch (Exception x) {
+                    x.printStackTrace();
+                }
+            }
+        } finally {
+            newZip.delete();
+        }
+
+
+
         // Throw a FNF exception when read a non-existing zip file
         try { unreached (new ZipFile(
                              new File(System.getProperty("test.src", "."),