changeset 7405:59ced5cf8344

8001043: Clarify definition restrictions Reviewed-by: alanb, skoivu, smarks
author dfuchs
date Mon, 18 Mar 2013 11:55:16 +0100
parents bf7120252a95
children 810688020f65
files src/share/classes/sun/rmi/server/LoaderHandler.java
diffstat 1 files changed, 28 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/classes/sun/rmi/server/LoaderHandler.java	Mon Mar 18 11:17:06 2013 +0100
+++ b/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);
+    }
+
 }