changeset 12439:cac3c5ec4cd6

8181205: JRE fails to load/register security providers when started from UNC pathname Reviewed-by: xuelei
author coffeys
date Wed, 07 Jun 2017 17:29:37 +0100
parents 05cae03b99b2
children e1b761ebd3b6
files src/share/classes/sun/misc/Launcher.java test/java/lang/ClassLoader/FindLibrary.java
diffstat 2 files changed, 60 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/classes/sun/misc/Launcher.java	Tue Jun 06 19:02:21 2017 +0300
+++ b/src/share/classes/sun/misc/Launcher.java	Wed Jun 07 17:29:37 2017 +0100
@@ -29,6 +29,7 @@
 import java.io.IOException;
 import java.io.FilePermission;
 import java.net.*;
+import java.nio.file.Paths;
 import java.util.HashSet;
 import java.util.StringTokenizer;
 import java.util.Set;
@@ -218,7 +219,9 @@
                     // skip this URL if cannot convert it to URI
                     continue;
                 }
-                File dir = new File(uri).getParentFile();
+                // Use the Paths.get(uri) call in order to handle
+                // UNC based file name conversion correctly.
+                File dir = Paths.get(uri).toFile().getParentFile();
                 if (dir != null && !dir.equals(prevDir)) {
                     // Look in architecture-specific subdirectory first
                     // Read from the saved system properties to avoid deadlock
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/lang/ClassLoader/FindLibrary.java	Wed Jun 07 17:29:37 2017 +0100
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 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
+ * 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.
+ */
+
+/* @test
+   @bug 8181205
+   @summary JRE fails to load/register security providers when started from UNC pathname
+*/
+
+import java.io.File;
+import java.lang.reflect.Method;
+import java.lang.reflect.Constructor;
+
+    public class FindLibrary {
+        public static void main(String[] args) throws Exception {
+            // this test is most relevant to windows. should pass silently on
+            // other OSes
+
+            Class<?> innerClazz = Class.forName("sun.misc.Launcher$ExtClassLoader");
+            Class<?>[] ctorArgTypes = {File[].class};
+
+            File tmpFile = new File(System.getProperty("java.home"));
+            File[] f = new File[1];
+            String uncFileName = "\\\\127.0.0.1\\" + tmpFile.getAbsolutePath().replace(':', '$');
+            System.out.println("Testing UNC path of :" + uncFileName);
+
+            f[0] = new File(uncFileName); // a UNC path that must exist
+            Object[] ctorArgs = {f};
+            Constructor constructor = innerClazz.getDeclaredConstructor(File[].class);
+            constructor.setAccessible(true);
+            Object o = constructor.newInstance(ctorArgs);
+            Method m = innerClazz.getMethod("findLibrary", String.class);
+            m.setAccessible(true);
+            //buggy JDK will throw IllegalArgumentException with next call
+            m.invoke(o, "test");
+        }
+    }