--- a/jdk/src/share/classes/sun/rmi/server/LoaderHandler.java Mon Mar 18 11:17:06 2013 +0100
+++ b/jdk/src/share/classes/sun/rmi/server/LoaderHandler.java Mon Mar 18 11:55:16 2013 +0100
@@ -55,6 +55,7 @@
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 @@
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 @@
* 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 @@
}
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 @@
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 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);
+ }
+
}