OpenJDK / loom / loom
changeset 15305:45a0eb6ab4f7
7183373: URLClassloader.close() does not close JAR files whose resources have been loaded via getResource()
Reviewed-by: chegar
author | dingxmin |
---|---|
date | Fri, 25 Jan 2013 17:00:18 +0800 |
parents | 6ea4b4f728b7 |
children | 4d1877e73daa |
files | jdk/src/share/classes/sun/misc/URLClassPath.java jdk/test/sun/misc/URLClassPath/JarLoaderTest.java |
diffstat | 2 files changed, 80 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/jdk/src/share/classes/sun/misc/URLClassPath.java Thu Jan 24 16:54:11 2013 -0800 +++ b/jdk/src/share/classes/sun/misc/URLClassPath.java Fri Jan 25 17:00:18 2013 +0800 @@ -508,7 +508,8 @@ } } else { // our best guess for the other cases - InputStream is = url.openStream(); + uc.setUseCaches(false); + InputStream is = uc.getInputStream(); is.close(); } return url;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/misc/URLClassPath/JarLoaderTest.java Fri Jan 25 17:00:18 2013 +0800 @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2013 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * Portions Copyright (c) 2013 IBM Corporation + */ + +/* @test + * @bug 7183373 + * @summary URLClassLoader fails to close handles to Jar files opened during + * getResource() + */ + +import java.io.*; +import java.net.*; +import java.util.zip.*; + +public class JarLoaderTest { + public static void main(String[] args) throws Exception { + // Create a JAR file + File f = new File("urlcl" + 1 + ".jar"); + ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(f)); + + // add a file + zos.putNextEntry(new ZipEntry("TestResource")); + byte[] b = "This is a test resource".getBytes(); + zos.write(b, 0, b.length); + zos.close(); + + // Load the file using cl.getResource() + URLClassLoader cl = new URLClassLoader(new URL[] { new URL("jar:" + + f.toURI().toURL() + "!/")}, null); + cl.getResource("TestResource"); + + // Close the class loader - this should free up all of its Closeables, + // including the JAR file + cl.close(); + + // Try to delete the JAR file + f.delete(); + + // Check to see if the file was deleted + if (f.exists()) { + System.out.println( + "Test FAILED: Closeables failed to close handle to jar file"); + // Delete the jar using a workaround + for (URL u : cl.getURLs()) { + if (u.getProtocol().equals("jar")) { + ((JarURLConnection)u.openConnection()).getJarFile().close(); + } + f.delete(); + } + throw new RuntimeException("File could not be deleted"); + } else { + System.out.println("Test PASSED"); + } + } +}