diff --git a/jdk/src/share/classes/sun/rmi/server/LoaderHandler.java b/jdk/src/share/classes/sun/rmi/server/LoaderHandler.java index 2e9d4552b13..7830ed354bb 100644 --- a/jdk/src/share/classes/sun/rmi/server/LoaderHandler.java +++ b/jdk/src/share/classes/sun/rmi/server/LoaderHandler.java @@ -55,6 +55,7 @@ import java.util.IdentityHashMap; import java.util.Map; import java.util.StringTokenizer; import java.util.WeakHashMap; +import sun.reflect.misc.ReflectUtil; import sun.rmi.runtime.Log; import sun.security.action.GetPropertyAction; @@ -170,7 +171,7 @@ public final class LoaderHandler { if (defaultLoader != null) { try { - Class c = Class.forName(name, false, defaultLoader); + Class c = loadClassForName(name, false, defaultLoader); if (loaderLog.isLoggable(Log.VERBOSE)) { loaderLog.log(Log.VERBOSE, "class \"" + name + "\" found via defaultLoader, " + @@ -422,7 +423,7 @@ public final class LoaderHandler { * resolved without the security-offending codebase anyway; * if so, return successfully (see bugids 4191926 & 4349670). */ - Class c = Class.forName(name, false, parent); + Class c = loadClassForName(name, false, parent); if (loaderLog.isLoggable(Log.VERBOSE)) { loaderLog.log(Log.VERBOSE, "class \"" + name + "\" found via " + @@ -448,7 +449,7 @@ public final class LoaderHandler { } try { - Class c = Class.forName(name, false, loader); + Class c = loadClassForName(name, false, loader); if (loaderLog.isLoggable(Log.VERBOSE)) { loaderLog.log(Log.VERBOSE, "class \"" + name + "\" " + "found via codebase, " + @@ -726,7 +727,7 @@ public final class LoaderHandler { for (int i = 0; i < interfaces.length; i++) { Class cl = - (classObjs[i] = Class.forName(interfaces[i], false, loader)); + (classObjs[i] = loadClassForName(interfaces[i], false, loader)); if (!Modifier.isPublic(cl.getModifiers())) { ClassLoader current = cl.getClassLoader(); @@ -1195,5 +1196,28 @@ public final class LoaderHandler { public String toString() { return super.toString() + "[\"" + annotation + "\"]"; } + + @Override + protected Class loadClass(String name, boolean resolve) + throws ClassNotFoundException { + if (parent == null) { + ReflectUtil.checkPackageAccess(name); + } + return super.loadClass(name, resolve); + } + + } + + private static Class loadClassForName(String name, + boolean initialize, + ClassLoader loader) + throws ClassNotFoundException + { + if (loader == null) { + ReflectUtil.checkPackageAccess(name); + } + return Class.forName(name, initialize, loader); + } + }