8008128: Better API coherence for JMX

Permission for getting classloader

Reviewed-by: alanb, dfuchs, skoivu
This commit is contained in:
Jean-Francois Denise 2013-03-27 09:59:17 +01:00 committed by Jean-Francois Denise
parent 62573eeab1
commit 4a77df1972
2 changed files with 41 additions and 6 deletions

View File

@ -27,12 +27,14 @@ package com.sun.jmx.mbeanserver;
import static com.sun.jmx.defaults.JmxProperties.MBEANSERVER_LOGGER; import static com.sun.jmx.defaults.JmxProperties.MBEANSERVER_LOGGER;
import java.security.Permission;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.logging.Level; import java.util.logging.Level;
import javax.management.MBeanPermission;
import javax.management.ObjectName; import javax.management.ObjectName;
import javax.management.loading.PrivateClassLoader; import javax.management.loading.PrivateClassLoader;
@ -300,7 +302,19 @@ final class ClassLoaderRepositorySupport
} }
public final ClassLoader getClassLoader(ObjectName name) { public final ClassLoader getClassLoader(ObjectName name) {
return loadersWithNames.get(name); ClassLoader instance = loadersWithNames.get(name);
if (instance != null) {
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
Permission perm =
new MBeanPermission(instance.getClass().getName(),
null,
name,
"getClassLoader");
sm.checkPermission(perm);
}
}
return instance;
} }
} }

View File

@ -33,7 +33,12 @@ import java.io.ObjectInputStream;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
import java.security.AccessControlContext;
import java.security.AccessController;
import java.security.Permission; import java.security.Permission;
import java.security.Permissions;
import java.security.PrivilegedAction;
import java.security.ProtectionDomain;
import java.util.Map; import java.util.Map;
import java.util.logging.Level; import java.util.logging.Level;
@ -127,9 +132,8 @@ public class MBeanInstantiator {
// Retrieve the class loader from the repository // Retrieve the class loader from the repository
ClassLoader loader = null; ClassLoader loader = null;
synchronized(this) { synchronized (this) {
if (clr!=null) loader = getClassLoader(aLoader);
loader = clr.getClassLoader(aLoader);
} }
if (loader == null) { if (loader == null) {
throw new InstanceNotFoundException("The loader named " + throw new InstanceNotFoundException("The loader named " +
@ -429,8 +433,7 @@ public class MBeanInstantiator {
try { try {
ClassLoader instance = null; ClassLoader instance = null;
if (clr!=null) instance = getClassLoader(loaderName);
instance = clr.getClassLoader(loaderName);
if (instance == null) if (instance == null)
throw new ClassNotFoundException(className); throw new ClassNotFoundException(className);
theClass = Class.forName(className, false, instance); theClass = Class.forName(className, false, instance);
@ -762,4 +765,22 @@ public class MBeanInstantiator {
throw new IllegalAccessException("Class is not public and can't be instantiated"); throw new IllegalAccessException("Class is not public and can't be instantiated");
} }
} }
private ClassLoader getClassLoader(final ObjectName name) {
if(clr == null){
return null;
}
// Restrict to getClassLoader permission only
Permissions permissions = new Permissions();
permissions.add(new MBeanPermission("*", null, name, "getClassLoader"));
ProtectionDomain protectionDomain = new ProtectionDomain(null, permissions);
ProtectionDomain[] domains = {protectionDomain};
AccessControlContext ctx = new AccessControlContext(domains);
ClassLoader loader = AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
public ClassLoader run() {
return clr.getClassLoader(name);
}
}, ctx);
return loader;
}
} }