# HG changeset patch # User alexp # Date 1304534146 25200 # Node ID 94ea3b8288f1e8754c131543fd814f58bdf4d845 # Parent b871f4cc7d8437668b5f80b61a3a6662c935ea38 7020198: ImageIcon creates Component with null acc Reviewed-by: rupashka, hawtin diff -r b871f4cc7d84 -r 94ea3b8288f1 src/share/classes/javax/swing/ImageIcon.java --- a/src/share/classes/javax/swing/ImageIcon.java Wed Apr 27 19:23:13 2011 -0700 +++ b/src/share/classes/javax/swing/ImageIcon.java Wed May 04 11:35:46 2011 -0700 @@ -40,8 +40,7 @@ import sun.awt.AppContext; import java.lang.reflect.Field; -import java.security.PrivilegedAction; -import java.security.AccessController; +import java.security.*; /** * An implementation of the Icon interface that paints Icons @@ -81,32 +80,51 @@ ImageObserver imageObserver; String description = null; + // Fields for twisted backward compatibility only. DO NOT USE. protected final static Component component; protected final static MediaTracker tracker; static { - component = new Component() {}; - AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { + component = AccessController.doPrivileged(new PrivilegedAction() { + public Component run() { try { + final Component component = createNoPermsComponent(); + // 6482575 - clear the appContext field so as not to leak it Field appContextField = - Component.class.getDeclaredField("appContext"); + + Component.class.getDeclaredField("appContext"); appContextField.setAccessible(true); appContextField.set(component, null); - } - catch (NoSuchFieldException e) { + + return component; + } catch (Throwable e) { + // We don't care about component. + // So don't prevent class initialisation. e.printStackTrace(); + return null; } - catch (IllegalAccessException e) { - e.printStackTrace(); - } - return null; } }); tracker = new MediaTracker(component); } + private static Component createNoPermsComponent() { + // 7020198 - set acc field to no permissions and no subject + // Note, will have appContext set. + return AccessController.doPrivileged( + new PrivilegedAction() { + public Component run() { + return new Component() { + }; + } + }, + new AccessControlContext(new ProtectionDomain[]{ + new ProtectionDomain(null, null) + }) + ); + } + /** * Id used in loading images from MediaTracker. */