8161121: VM::isSystemDomainLoader should consider platform class loader
authormchung
Fri, 28 Jul 2017 13:22:33 -0700
changeset 46047 97d615d81827
parent 46046 54ca7058579d
child 46048 00b5dc9d9be5
8161121: VM::isSystemDomainLoader should consider platform class loader Reviewed-by: alanb
jdk/src/java.base/share/classes/java/lang/Class.java
jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java
jdk/src/java.base/share/classes/java/lang/reflect/Proxy.java
jdk/src/java.base/share/classes/jdk/internal/logger/DefaultLoggerFinder.java
jdk/src/java.base/share/classes/jdk/internal/misc/VM.java
jdk/src/java.base/share/classes/jdk/internal/reflect/Reflection.java
jdk/src/java.management/share/classes/java/lang/management/ManagementFactory.java
--- a/jdk/src/java.base/share/classes/java/lang/Class.java	Fri Jul 28 02:34:40 2017 +0000
+++ b/jdk/src/java.base/share/classes/java/lang/Class.java	Fri Jul 28 13:22:33 2017 -0700
@@ -364,9 +364,9 @@
             // Reflective call to get caller class is only needed if a security manager
             // is present.  Avoid the overhead of making this call otherwise.
             caller = Reflection.getCallerClass();
-            if (VM.isSystemDomainLoader(loader)) {
+            if (loader == null) {
                 ClassLoader ccl = ClassLoader.getClassLoader(caller);
-                if (!VM.isSystemDomainLoader(ccl)) {
+                if (ccl != null) {
                     sm.checkPermission(
                         SecurityConstants.GET_CLASSLOADER_PERMISSION);
                 }
--- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java	Fri Jul 28 02:34:40 2017 +0000
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java	Fri Jul 28 13:22:33 2017 -0700
@@ -2476,7 +2476,7 @@
                 return false;
             }
             ClassLoader loader = defc.getClassLoader();
-            if (!jdk.internal.misc.VM.isSystemDomainLoader(loader)) {
+            if (loader != null) {
                 ClassLoader sysl = ClassLoader.getSystemClassLoader();
                 boolean found = false;
                 while (sysl != null) {
--- a/jdk/src/java.base/share/classes/java/lang/reflect/Proxy.java	Fri Jul 28 02:34:40 2017 +0000
+++ b/jdk/src/java.base/share/classes/java/lang/reflect/Proxy.java	Fri Jul 28 13:22:33 2017 -0700
@@ -453,7 +453,7 @@
         SecurityManager sm = System.getSecurityManager();
         if (sm != null) {
             ClassLoader ccl = caller.getClassLoader();
-            if (VM.isSystemDomainLoader(loader) && !VM.isSystemDomainLoader(ccl)) {
+            if (loader == null && ccl != null) {
                 sm.checkPermission(SecurityConstants.GET_CLASSLOADER_PERMISSION);
             }
             ReflectUtil.checkProxyPackageAccess(ccl, interfaces);
--- a/jdk/src/java.base/share/classes/jdk/internal/logger/DefaultLoggerFinder.java	Fri Jul 28 02:34:40 2017 +0000
+++ b/jdk/src/java.base/share/classes/jdk/internal/logger/DefaultLoggerFinder.java	Fri Jul 28 13:22:33 2017 -0700
@@ -25,6 +25,8 @@
 
 package jdk.internal.logger;
 
+import jdk.internal.misc.VM;
+
 import java.lang.ref.Reference;
 import java.lang.ref.WeakReference;
 import java.util.HashMap;
@@ -140,15 +142,9 @@
         return AccessController.doPrivileged(new PrivilegedAction<>() {
             @Override
             public Boolean run() {
-                final ClassLoader moduleCL = m.getClassLoader();
-                if (moduleCL == null) return true;
-                ClassLoader cl = ClassLoader.getPlatformClassLoader();
-                while (cl != null && moduleCL != cl) {
-                    cl = cl.getParent();
-                }
                 // returns true if moduleCL is the platform class loader
                 // or one of its ancestors.
-                return moduleCL == cl;
+                return VM.isSystemDomainLoader(m.getClassLoader());
             }
         });
     }
--- a/jdk/src/java.base/share/classes/jdk/internal/misc/VM.java	Fri Jul 28 02:34:40 2017 +0000
+++ b/jdk/src/java.base/share/classes/jdk/internal/misc/VM.java	Fri Jul 28 13:22:33 2017 -0700
@@ -124,11 +124,11 @@
     }
 
     /**
-     * Returns true if the given class loader is in the system domain
-     * in which all permissions are granted.
+     * Returns true if the given class loader is the bootstrap class loader
+     * or the platform class loader.
      */
     public static boolean isSystemDomainLoader(ClassLoader loader) {
-        return loader == null;
+        return loader == null || loader == ClassLoader.getPlatformClassLoader();
     }
 
     /**
--- a/jdk/src/java.base/share/classes/jdk/internal/reflect/Reflection.java	Fri Jul 28 02:34:40 2017 +0000
+++ b/jdk/src/java.base/share/classes/jdk/internal/reflect/Reflection.java	Fri Jul 28 13:22:33 2017 -0700
@@ -316,8 +316,7 @@
      */
     public static boolean isCallerSensitive(Method m) {
         final ClassLoader loader = m.getDeclaringClass().getClassLoader();
-        if (VM.isSystemDomainLoader(loader) ||
-                loader == ClassLoaders.platformClassLoader()) {
+        if (VM.isSystemDomainLoader(loader)) {
             return m.isAnnotationPresent(CallerSensitive.class);
         }
         return false;
--- a/jdk/src/java.management/share/classes/java/lang/management/ManagementFactory.java	Fri Jul 28 02:34:40 2017 +0000
+++ b/jdk/src/java.management/share/classes/java/lang/management/ManagementFactory.java	Fri Jul 28 13:22:33 2017 -0700
@@ -588,8 +588,8 @@
                                Class<T> mxbeanInterface)
             throws java.io.IOException {
 
-        // Only allow MXBean interfaces from rt.jar loaded by the
-        // bootstrap class loader
+        // Only allow MXBean interfaces from the platform modules loaded by the
+        // bootstrap or platform class loader
         final Class<?> cls = mxbeanInterface;
         ClassLoader loader =
             AccessController.doPrivileged(