src/java.base/share/classes/java/lang/ClassLoader.java

Print this page
rev 11200 : [mq]: 8067951-System.loadLibrary.cannot.find.library.when.path.contains.quoted.entry

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2013, 2014 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2015 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.  Oracle designates this

@@ -1745,39 +1745,60 @@
 
     // The paths searched for libraries
     private static String usr_paths[];
     private static String sys_paths[];
 
-    private static String[] initializePath(String propname) {
-        String ldpath = System.getProperty(propname, "");
-        String ps = File.pathSeparator;
-        int ldlen = ldpath.length();
-        int i, j, n;
-        // Count the separators in the path
-        i = ldpath.indexOf(ps);
-        n = 0;
-        while (i >= 0) {
-            n++;
-            i = ldpath.indexOf(ps, i + 1);
-        }
-
-        // allocate the array of paths - n :'s = n + 1 path elements
-        String[] paths = new String[n + 1];
-
-        // Fill the array with paths from the ldpath
-        n = i = 0;
-        j = ldpath.indexOf(ps);
-        while (j >= 0) {
-            if (j - i > 0) {
-                paths[n++] = ldpath.substring(i, j);
-            } else if (j - i == 0) {
-                paths[n++] = ".";
+    private static String[] initializePath(String propName) {
+        String ldPath = System.getProperty(propName, "");
+        int ldLen = ldPath.length();
+        char ps = File.pathSeparatorChar;
+        boolean mayBeQuoted = ClassLoaderHelper.allowsQuotedPathElements;
+
+        int psCount = 0;
+        boolean inQuotes = false;
+        boolean thereAreQuotes = false;
+        for (int i = 0; i < ldLen; ++i) {
+            char ch = ldPath.charAt(i);
+            if (mayBeQuoted && ch == '\"') {
+                inQuotes = !inQuotes;
+                thereAreQuotes = true;
+            } else if (!inQuotes && ch == ps) {
+                psCount++;
             }
-            i = j + 1;
-            j = ldpath.indexOf(ps, i);
         }
-        paths[n] = ldpath.substring(i, ldlen);
+
+        String[] paths = new String[psCount + 1];
+        if (thereAreQuotes) {
+            char[] pathBuf = new char[ldLen];
+            int pathLen = 0;
+            psCount = 0;
+            inQuotes = false;
+            for (int i = 0; i < ldLen; ++i) {
+                char ch = ldPath.charAt(i);
+                if (ch == '\"') {
+                    inQuotes = !inQuotes;
+                } else if (!inQuotes && ch == ps) {
+                    paths[psCount++] = (pathLen > 0) ?
+                            new String(pathBuf, 0, pathLen) : ".";
+                    pathLen = 0;
+                } else {
+                    pathBuf[pathLen++] = ch;
+                }
+            }
+            paths[psCount] = (pathLen > 0) ?
+                    new String(pathBuf, 0, pathLen) : ".";
+        } else {
+            int pathStart = 0;
+            for (int j = 0; j < psCount; ++j) {
+                int pathEnd = ldPath.indexOf(ps, pathStart);
+                paths[j] = (pathStart < pathEnd) ?
+                        ldPath.substring(pathStart, pathEnd) : ".";
+                pathStart = pathEnd + 1;
+            }
+            paths[psCount] = (pathStart < ldLen) ?
+                    ldPath.substring(pathStart, ldLen) : ".";
+        }
         return paths;
     }
 
     // Invoked in the java.lang.Runtime class to implement load and loadLibrary.
     static void loadLibrary(Class<?> fromClass, String name,