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,