From dd224c8deb4e364ba17379f36a89f990f04d32d5 Mon Sep 17 00:00:00 2001 From: Sergey Malenkov Date: Fri, 27 Sep 2013 22:17:24 +0400 Subject: [PATCH] 8012716: java.beans.EventHandler.create method should check if the given listenerInterface is a public interface Reviewed-by: art, mchung --- .../classes/java/beans/EventHandler.java | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/jdk/src/share/classes/java/beans/EventHandler.java b/jdk/src/share/classes/java/beans/EventHandler.java index b428f2892a1..935f7359e26 100644 --- a/jdk/src/share/classes/java/beans/EventHandler.java +++ b/jdk/src/share/classes/java/beans/EventHandler.java @@ -33,6 +33,7 @@ import java.security.AccessController; import java.security.PrivilegedAction; import sun.reflect.misc.MethodUtil; +import sun.reflect.misc.ReflectUtil; /** * The EventHandler class provides @@ -677,22 +678,38 @@ public class EventHandler implements InvocationHandler { * * @see EventHandler */ - @SuppressWarnings("unchecked") public static T create(Class listenerInterface, Object target, String action, String eventPropertyName, String listenerMethodName) { // Create this first to verify target/action are non-null - EventHandler eventHandler = new EventHandler(target, action, + final EventHandler handler = new EventHandler(target, action, eventPropertyName, listenerMethodName); if (listenerInterface == null) { throw new NullPointerException( "listenerInterface must be non-null"); } - return (T)Proxy.newProxyInstance(target.getClass().getClassLoader(), - new Class[] {listenerInterface}, - eventHandler); + final ClassLoader loader = getClassLoader(listenerInterface); + final Class[] interfaces = {listenerInterface}; + return AccessController.doPrivileged(new PrivilegedAction() { + @SuppressWarnings("unchecked") + public T run() { + return (T) Proxy.newProxyInstance(loader, interfaces, handler); + } + }); + } + + private static ClassLoader getClassLoader(Class type) { + ReflectUtil.checkPackageAccess(type); + ClassLoader loader = type.getClassLoader(); + if (loader == null) { + loader = Thread.currentThread().getContextClassLoader(); // avoid use of BCP + if (loader == null) { + loader = ClassLoader.getSystemClassLoader(); + } + } + return loader; } }