diff --git a/src/share/classes/com/sun/jmx/mbeanserver/ConvertingMethod.java b/src/share/classes/com/sun/jmx/mbeanserver/ConvertingMethod.java index 566af9e261961a86f5f247fe7d774a2dcd549867..c0dae31946c2254af0fdcf758cf486043f95ff0d 100644 --- a/src/share/classes/com/sun/jmx/mbeanserver/ConvertingMethod.java +++ b/src/share/classes/com/sun/jmx/mbeanserver/ConvertingMethod.java @@ -33,6 +33,7 @@ import javax.management.Descriptor; import javax.management.MBeanException; import javax.management.openmbean.OpenDataException; import javax.management.openmbean.OpenType; +import sun.reflect.misc.MethodUtil; final class ConvertingMethod { static ConvertingMethod from(Method m) { @@ -189,7 +190,7 @@ final class ConvertingMethod { "from open values: " + e; throw new MBeanException(e, msg); } - final Object javaReturn = method.invoke(obj, javaParams); + final Object javaReturn = MethodUtil.invoke(method, obj, javaParams); try { return returnMapping.toOpenValue(javaReturn); } catch (OpenDataException e) { diff --git a/src/share/classes/com/sun/jmx/mbeanserver/DefaultMXBeanMappingFactory.java b/src/share/classes/com/sun/jmx/mbeanserver/DefaultMXBeanMappingFactory.java index 612e20024dad256b3e24d31d73444bf38db0ae08..c5e00005b8760ad0c2f18f4fd63a17e7541b6465 100644 --- a/src/share/classes/com/sun/jmx/mbeanserver/DefaultMXBeanMappingFactory.java +++ b/src/share/classes/com/sun/jmx/mbeanserver/DefaultMXBeanMappingFactory.java @@ -74,6 +74,8 @@ import javax.management.openmbean.SimpleType; import javax.management.openmbean.TabularData; import javax.management.openmbean.TabularDataSupport; import javax.management.openmbean.TabularType; +import sun.reflect.misc.MethodUtil; +import sun.reflect.misc.ReflectUtil; /** *

A converter between Java types and the limited set of classes @@ -299,6 +301,7 @@ public class DefaultMXBeanMappingFactory extends MXBeanMappingFactory { private static > MXBeanMapping makeEnumMapping(Class enumClass, Class fake) { + ReflectUtil.checkPackageAccess(enumClass); return new EnumMapping(Util.>cast(enumClass)); } @@ -423,6 +426,7 @@ public class DefaultMXBeanMappingFactory extends MXBeanMappingFactory { (c.getName().equals("com.sun.management.GcInfo") && c.getClassLoader() == null); + ReflectUtil.checkPackageAccess(c); final List methods = MBeanAnalyzer.eliminateCovariantMethods(Arrays.asList(c.getMethods())); final SortedMap getterMap = newSortedMap(); @@ -828,7 +832,7 @@ public class DefaultMXBeanMappingFactory extends MXBeanMappingFactory { Object[] values = new Object[getters.length]; for (int i = 0; i < getters.length; i++) { try { - Object got = getters[i].invoke(value, (Object[]) null); + Object got = MethodUtil.invoke(getters[i], value, (Object[]) null); values[i] = getterMappings[i].toOpenValue(got); } catch (Exception e) { throw openDataException("Error calling getter for " + @@ -1011,7 +1015,7 @@ public class DefaultMXBeanMappingFactory extends MXBeanMappingFactory { MXBeanMapping[] converters) throws InvalidObjectException { try { - return fromMethod.invoke(null, cd); + return MethodUtil.invoke(fromMethod, null, new Object[] {cd}); } catch (Exception e) { final String msg = "Failed to invoke from(CompositeData)"; throw invalidObjectException(msg, e); @@ -1107,13 +1111,15 @@ public class DefaultMXBeanMappingFactory extends MXBeanMappingFactory { throws InvalidObjectException { Object o; try { - o = getTargetClass().newInstance(); + final Class targetClass = getTargetClass(); + ReflectUtil.checkPackageAccess(targetClass); + o = targetClass.newInstance(); for (int i = 0; i < itemNames.length; i++) { if (cd.containsKey(itemNames[i])) { Object openItem = cd.get(itemNames[i]); Object javaItem = converters[i].fromOpenValue(openItem); - setters[i].invoke(o, javaItem); + MethodUtil.invoke(setters[i], o, new Object[] {javaItem}); } } } catch (Exception e) { @@ -1363,6 +1369,7 @@ public class DefaultMXBeanMappingFactory extends MXBeanMappingFactory { } try { + ReflectUtil.checkPackageAccess(max.constructor.getDeclaringClass()); return max.constructor.newInstance(params); } catch (Exception e) { final String msg = diff --git a/src/share/classes/com/sun/jmx/mbeanserver/StandardMBeanIntrospector.java b/src/share/classes/com/sun/jmx/mbeanserver/StandardMBeanIntrospector.java index 9b2e9c4f9495817a5b5197c331e344e4ead6cd8e..2388eae73665660608cea23c4ca35bda88a93d21 100644 --- a/src/share/classes/com/sun/jmx/mbeanserver/StandardMBeanIntrospector.java +++ b/src/share/classes/com/sun/jmx/mbeanserver/StandardMBeanIntrospector.java @@ -38,6 +38,7 @@ import javax.management.MBeanOperationInfo; import javax.management.NotCompliantMBeanException; import javax.management.NotificationBroadcaster; import javax.management.NotificationBroadcasterSupport; +import sun.reflect.misc.MethodUtil; /** * @since 1.6 @@ -108,7 +109,7 @@ class StandardMBeanIntrospector extends MBeanIntrospector { Object invokeM2(Method m, Object target, Object[] args, Object cookie) throws InvocationTargetException, IllegalAccessException, MBeanException { - return m.invoke(target, args); + return MethodUtil.invoke(m, target, args); } @Override diff --git a/src/share/classes/javax/management/openmbean/CompositeDataInvocationHandler.java b/src/share/classes/javax/management/openmbean/CompositeDataInvocationHandler.java index d58ab7d0e8fa58672af777dcafd8ba6cade252bc..6b420500552b607a334f418f8426838de509f27f 100644 --- a/src/share/classes/javax/management/openmbean/CompositeDataInvocationHandler.java +++ b/src/share/classes/javax/management/openmbean/CompositeDataInvocationHandler.java @@ -169,6 +169,8 @@ public class CompositeDataInvocationHandler implements InvocationHandler { the only non-final methods in Object that are not handled above are finalize and clone, and these are not overridden in generated proxies. */ + // this plain Method.invoke is called only if the declaring class + // is Object and so it's safe. return method.invoke(this, args); } } diff --git a/src/share/classes/javax/management/openmbean/OpenMBeanAttributeInfoSupport.java b/src/share/classes/javax/management/openmbean/OpenMBeanAttributeInfoSupport.java index 070c39d9cc2722c1b3c9147059fef52146bca227..116ca6d9ecaac85643deea2d576afbea305f9f2d 100644 --- a/src/share/classes/javax/management/openmbean/OpenMBeanAttributeInfoSupport.java +++ b/src/share/classes/javax/management/openmbean/OpenMBeanAttributeInfoSupport.java @@ -45,6 +45,9 @@ import javax.management.DescriptorRead; import javax.management.ImmutableDescriptor; import javax.management.MBeanAttributeInfo; import com.sun.jmx.remote.util.EnvHelp; +import sun.reflect.misc.ConstructorUtil; +import sun.reflect.misc.MethodUtil; +import sun.reflect.misc.ReflectUtil; /** * Describes an attribute of an open MBean. @@ -690,6 +693,7 @@ public class OpenMBeanAttributeInfoSupport private static T convertFromString(String s, OpenType openType) { Class c; try { + ReflectUtil.checkPackageAccess(openType.safeGetClassName()); c = cast(Class.forName(openType.safeGetClassName())); } catch (ClassNotFoundException e) { throw new NoClassDefFoundError(e.toString()); // can't happen @@ -698,6 +702,8 @@ public class OpenMBeanAttributeInfoSupport // Look for: public static T valueOf(String) Method valueOf; try { + // It is safe to call this plain Class.getMethod because the class "c" + // was checked before by ReflectUtil.checkPackageAccess(openType.safeGetClassName()); valueOf = c.getMethod("valueOf", String.class); if (!Modifier.isStatic(valueOf.getModifiers()) || valueOf.getReturnType() != c) @@ -707,7 +713,7 @@ public class OpenMBeanAttributeInfoSupport } if (valueOf != null) { try { - return c.cast(valueOf.invoke(null, s)); + return c.cast(MethodUtil.invoke(valueOf, null, new Object[] {s})); } catch (Exception e) { final String msg = "Could not convert \"" + s + "\" using method: " + valueOf; @@ -718,6 +724,8 @@ public class OpenMBeanAttributeInfoSupport // Look for: public T(String) Constructor con; try { + // It is safe to call this plain Class.getConstructor because the class "c" + // was checked before by ReflectUtil.checkPackageAccess(openType.safeGetClassName()); con = c.getConstructor(String.class); } catch (NoSuchMethodException e) { con = null;