aboutsummaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2006-01-17 23:25:12 +0000
committerTom Tromey <tromey@gcc.gnu.org>2006-01-17 23:25:12 +0000
commit96c6b0e22a1fbb1a3a8983b5765df57311cea3b6 (patch)
tree201e8542f05dcd33e5a48830e4e6ac2a4ee84ae1 /libjava
parenta37a4460b58efb3e01d94dc944babdbea2780a22 (diff)
downloadgcc-96c6b0e22a1fbb1a3a8983b5765df57311cea3b6.zip
gcc-96c6b0e22a1fbb1a3a8983b5765df57311cea3b6.tar.gz
gcc-96c6b0e22a1fbb1a3a8983b5765df57311cea3b6.tar.bz2
re PR classpath/20198 (java.security.CodeSource.getLocation output is different than expected)
PR classpath/20198: * java/net/URLClassLoader.java (FileURLLoader): Added argument. (JarURLLoader): Likewise. (addURLImpl): Canonicalize file URLs. From-SVN: r109844
Diffstat (limited to 'libjava')
-rw-r--r--libjava/ChangeLog7
-rw-r--r--libjava/java/net/URLClassLoader.java48
2 files changed, 47 insertions, 8 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index f8df781..9b8dff9 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,10 @@
+2006-01-17 Tom Tromey <tromey@redhat.com>
+
+ PR classpath/20198:
+ * java/net/URLClassLoader.java (FileURLLoader): Added argument.
+ (JarURLLoader): Likewise.
+ (addURLImpl): Canonicalize file URLs.
+
2006-01-16 Mark Wielaard <mark@klomp.org>
Imported GNU Classpath 0.20
diff --git a/libjava/java/net/URLClassLoader.java b/libjava/java/net/URLClassLoader.java
index 5bb0337..ada4b63 100644
--- a/libjava/java/net/URLClassLoader.java
+++ b/libjava/java/net/URLClassLoader.java
@@ -1,5 +1,5 @@
/* URLClassLoader.java -- ClassLoader that loads classes from one or more URLs
- Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+ Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -305,9 +305,10 @@ public class URLClassLoader extends SecureClassLoader
Vector classPath; // The "Class-Path" attribute of this Jar's manifest
- public JarURLLoader(URLClassLoader classloader, URL baseURL)
+ public JarURLLoader(URLClassLoader classloader, URL baseURL,
+ URL absoluteUrl)
{
- super(classloader, baseURL);
+ super(classloader, baseURL, absoluteUrl);
// Cache url prefix for all resources in this jar url.
String external = baseURL.toExternalForm();
@@ -601,10 +602,10 @@ public class URLClassLoader extends SecureClassLoader
{
File dir; //the file for this file url
- FileURLLoader(URLClassLoader classloader, URL url)
+ FileURLLoader(URLClassLoader classloader, URL url, URL absoluteUrl)
{
- super(classloader, url);
- dir = new File(baseURL.getFile());
+ super(classloader, url, absoluteUrl);
+ dir = new File(absoluteUrl.getFile());
}
/** get resource with the name "name" in the file url */
@@ -885,13 +886,44 @@ public class URLClassLoader extends SecureClassLoader
String file = newUrl.getFile();
String protocol = newUrl.getProtocol();
+ // If we have a file: URL, we want to make it absolute
+ // here, before we decide whether it is really a jar.
+ URL absoluteURL;
+ if ("file".equals (protocol))
+ {
+ File dir = new File(file);
+ URL absUrl;
+ try
+ {
+ absoluteURL = dir.getCanonicalFile().toURL();
+ }
+ catch (IOException ignore)
+ {
+ try
+ {
+ absoluteURL = dir.getAbsoluteFile().toURL();
+ }
+ catch (MalformedURLException _)
+ {
+ // This really should not happen.
+ absoluteURL = newUrl;
+ }
+ }
+ }
+ else
+ {
+ // This doesn't hurt, and it simplifies the logic a
+ // little.
+ absoluteURL = newUrl;
+ }
+
// Check that it is not a directory
if ("gcjlib".equals(protocol))
loader = new SoURLLoader(this, newUrl);
else if (! (file.endsWith("/") || file.endsWith(File.separator)))
- loader = new JarURLLoader(this, newUrl);
+ loader = new JarURLLoader(this, newUrl, absoluteURL);
else if ("file".equals(protocol))
- loader = new FileURLLoader(this, newUrl);
+ loader = new FileURLLoader(this, newUrl, absoluteURL);
else if ("core".equals(protocol))
loader = new CoreURLLoader(this, newUrl);
else