< prev index next >

src/java.base/share/classes/jdk/internal/loader/URLClassPath.java

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 1997, 2018, 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 --- 1,7 ---- /* ! * Copyright (c) 1997, 2019, 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
*** 1090,1103 **** StringTokenizer st = new StringTokenizer(value); URL[] urls = new URL[st.countTokens()]; int i = 0; while (st.hasMoreTokens()) { String path = st.nextToken(); ! URL url = DISABLE_CP_URL_CHECK ? new URL(base, path) : safeResolve(base, path); if (url != null) { urls[i] = url; i++; } } if (i == 0) { urls = null; } else if (i != urls.length) { --- 1090,1108 ---- StringTokenizer st = new StringTokenizer(value); URL[] urls = new URL[st.countTokens()]; int i = 0; while (st.hasMoreTokens()) { String path = st.nextToken(); ! URL url = DISABLE_CP_URL_CHECK ? new URL(base, path) : tryResolve(base, path); if (url != null) { urls[i] = url; i++; + } else { + if (DEBUG_CP_URL_CHECK) { + System.err.println("Class-Path entry: \"" + path + + "\" ignored in JAR file " + base); + } } } if (i == 0) { urls = null; } else if (i != urls.length) {
*** 1105,1126 **** urls = Arrays.copyOf(urls, i); } return urls; } ! /* ! * Return a URL for the given path resolved against the base URL, or ! * null if the resulting URL is invalid. */ ! static URL safeResolve(URL base, String path) { ! String child = path.replace(File.separatorChar, '/'); ! try { ! if (!URI.create(child).isAbsolute()) { URL url = new URL(base, child); - if (base.getProtocol().equalsIgnoreCase("file")) { - return url; - } else { String bp = base.getPath(); String urlp = url.getPath(); int pos = bp.lastIndexOf('/'); if (pos == -1) { pos = bp.length() - 1; --- 1110,1164 ---- urls = Arrays.copyOf(urls, i); } return urls; } ! ! static URL tryResolve(URL base, String input) throws MalformedURLException { ! if ("file".equalsIgnoreCase(base.getProtocol())) { ! return tryResolveFile(base, input); ! } else { ! return tryResolveNonFile(base, input); ! } ! } ! ! /** ! * Attempt to return a file URL by resolving input against a base file ! * URL. The input is an absolute or relative file URL that encodes a ! * file path. ! * ! * @apiNote Nonsensical input such as a Windows file path with a drive ! * letter cannot be disambiguated from an absolute URL so will be rejected ! * (by returning null) by this method. ! * ! * @return the resolved URL or null if the input is an absolute URL with ! * a scheme other than file (ignoring case) ! * @throws MalformedURLException ! */ ! static URL tryResolveFile(URL base, String input) throws MalformedURLException { ! int index = input.indexOf(':'); ! boolean isFile; ! if (index >= 0) { ! String scheme = input.substring(0, index); ! isFile = "file".equalsIgnoreCase(scheme); ! } else { ! isFile = true; ! } ! return (isFile) ? new URL(base, input) : null; ! } ! ! /** ! * Attempt to return a URL by resolving input against a base URL. Returns ! * null if the resolved URL is not contained by the base URL. ! * ! * @return the resolved URL or null ! * @throws MalformedURLException */ ! static URL tryResolveNonFile(URL base, String input) throws MalformedURLException { ! String child = input.replace(File.separatorChar, '/'); ! if (isRelative(child)) { URL url = new URL(base, child); String bp = base.getPath(); String urlp = url.getPath(); int pos = bp.lastIndexOf('/'); if (pos == -1) { pos = bp.length() - 1;
*** 1128,1143 **** if (urlp.regionMatches(0, bp, 0, pos + 1) && urlp.indexOf("..", pos) == -1) { return url; } } } ! } catch (MalformedURLException | IllegalArgumentException e) {} ! if (DEBUG_CP_URL_CHECK) { ! System.err.println("Class-Path entry: \"" + path + "\" ignored in JAR file " + base); } - return null; } } /* * Nested class used to represent a loader of classes and resources --- 1166,1187 ---- if (urlp.regionMatches(0, bp, 0, pos + 1) && urlp.indexOf("..", pos) == -1) { return url; } } + return null; } ! ! /** ! * Returns true if the given input is a relative URI. ! */ ! static boolean isRelative(String child) { ! try { ! return !URI.create(child).isAbsolute(); ! } catch (IllegalArgumentException e) { ! return false; } } } /* * Nested class used to represent a loader of classes and resources
< prev index next >