From 29b881f4d32c3bc9b1eb6ff9fbf786bd6ce49ae7 Mon Sep 17 00:00:00 2001 From: aph Date: Mon, 16 Apr 2007 13:44:59 +0000 Subject: [PATCH] 2007-04-16 Andrew Haley * gnu/gcj/runtime/BootClassLoader.java (getBootURLLoader): New method. (bootGetResource): Use getBootURLLoader() to load resources. (bootGetResources): Likewise. * java/lang/reflect/natMethod.cc (Method::invoke): In invoke also check that the method's declaring class is accessible. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@123862 138bc75d-0d04-0410-961f-82ee72b054a4 --- libjava/ChangeLog | 10 +++++ libjava/gnu/gcj/runtime/BootClassLoader.java | 62 +++++++++++++++++++++++++++- libjava/java/lang/reflect/natMethod.cc | 28 ++++++++++--- 3 files changed, 93 insertions(+), 7 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index d5f02553dd6..31bbd012d2c 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,13 @@ +2007-04-16 Andrew Haley + + * gnu/gcj/runtime/BootClassLoader.java (getBootURLLoader): New + method. + (bootGetResource): Use getBootURLLoader() to load resources. + (bootGetResources): Likewise. + + * java/lang/reflect/natMethod.cc (Method::invoke): In invoke also + check that the method's declaring class is accessible. + 2007-04-10 Keith Seitz * sources.am: Regenerate. diff --git a/libjava/gnu/gcj/runtime/BootClassLoader.java b/libjava/gnu/gcj/runtime/BootClassLoader.java index 731703ab8f3..40f3147b7be 100644 --- a/libjava/gnu/gcj/runtime/BootClassLoader.java +++ b/libjava/gnu/gcj/runtime/BootClassLoader.java @@ -9,9 +9,13 @@ details. */ package gnu.gcj.runtime; import gnu.java.net.protocol.core.Handler; +import java.io.File; import java.io.IOException; import java.net.URL; +import java.net.URLClassLoader; import java.util.Enumeration; +import java.util.StringTokenizer; +import java.util.Vector; /** * This is a helper for the bootstrap class loader. It is a @@ -27,6 +31,9 @@ public final class BootClassLoader extends HelperClassLoader // path fails otherwise. static Class coreHandler = gnu.java.net.protocol.core.Handler.class; + private boolean initialized; + private URLClassLoader bootURLLoader; + BootClassLoader(String libdir) { // The BootClassLoader is the top of the delegation chain. It does not @@ -68,13 +75,64 @@ public final class BootClassLoader extends HelperClassLoader return c; } + // Parse the boot classpath and create a URLClassLoader that loads + // resources from it. This is provided for the benefit of code that + // does things like + // ClassLoader.getResourceAsStream("java/lang/Object.class") + private synchronized URLClassLoader getBootURLLoader() + { + if (initialized) + return bootURLLoader; + initialized = true; + + Vector urls = new Vector(); + String bootClasspath = System.getProperty ("sun.boot.class.path"); + StringTokenizer st = + new StringTokenizer(bootClasspath, File.pathSeparator); + while (st.hasMoreTokens()) + { + try + { + urls.add(new File(st.nextToken()).toURL()); + } + catch (java.net.MalformedURLException e) + { + } + } + + if (urls.size() > 0) + bootURLLoader = new URLClassLoader(urls.toArray(new URL[urls.size()])); + return bootURLLoader; + } + public URL bootGetResource(String name) { - return findResource(name); + URL url = findResource(name); + if (url != null) + return url; + + URLClassLoader loader = getBootURLLoader(); + if (loader != null) + url = loader.findResource(name); + + return url; } public Enumeration bootGetResources(String name) throws IOException { - return findResources(name); + URLClassLoader loader = getBootURLLoader(); + Enumeration[] e = + { + findResources(name), + (loader != null) ? loader.findResources(name) : null + }; + + Vector v = new Vector(); + for (Enumeration en : e) + if (en != null) + while (en.hasMoreElements()) + v.add(en.nextElement()); + + return v.elements(); } } diff --git a/libjava/java/lang/reflect/natMethod.cc b/libjava/java/lang/reflect/natMethod.cc index 6dcd4ec518a..4593da7f49e 100644 --- a/libjava/java/lang/reflect/natMethod.cc +++ b/libjava/java/lang/reflect/natMethod.cc @@ -173,16 +173,34 @@ java::lang::reflect::Method::invoke (jobject obj, jobjectArray args) } // Check accessibility, if required. - if (! (Modifier::isPublic (meth->accflags) || this->isAccessible())) + if (! this->isAccessible()) { - Class *caller = _Jv_StackTrace::GetCallingClass (&Method::class$); - if (! _Jv_CheckAccess(caller, declaringClass, meth->accflags)) - throw new IllegalAccessException; + if (! (Modifier::isPublic (meth->accflags))) + { + Class *caller = _Jv_StackTrace::GetCallingClass (&Method::class$); + if (! _Jv_CheckAccess(caller, declaringClass, meth->accflags)) + throw new IllegalAccessException; + } + else + // Method is public, check to see if class is accessible. + { + jint flags = (declaringClass->accflags + & (Modifier::PUBLIC + | Modifier::PROTECTED + | Modifier::PRIVATE)); + if (flags == 0) // i.e. class is package private + { + Class *caller = _Jv_StackTrace::GetCallingClass (&Method::class$); + if (! _Jv_ClassNameSamePackage (caller->name, + declaringClass->name)) + throw new IllegalAccessException; + } + } } if (declaringClass->isInterface()) iface = declaringClass; - + return _Jv_CallAnyMethodA (obj, return_type, meth, false, parameter_types, args, iface); } -- 2.11.0