Mercurial > hg > icedtea8-forest > jdk
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", "."),