提交 dc6d3f6f 编写于 作者: A alexp

7020198: ImageIcon creates Component with null acc

Reviewed-by: rupashka, hawtin
上级 899f87d6
...@@ -40,8 +40,7 @@ import javax.accessibility.*; ...@@ -40,8 +40,7 @@ import javax.accessibility.*;
import sun.awt.AppContext; import sun.awt.AppContext;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.security.PrivilegedAction; import java.security.*;
import java.security.AccessController;
/** /**
* An implementation of the Icon interface that paints Icons * An implementation of the Icon interface that paints Icons
...@@ -81,32 +80,51 @@ public class ImageIcon implements Icon, Serializable, Accessible { ...@@ -81,32 +80,51 @@ public class ImageIcon implements Icon, Serializable, Accessible {
ImageObserver imageObserver; ImageObserver imageObserver;
String description = null; String description = null;
// Fields for twisted backward compatibility only. DO NOT USE.
protected final static Component component; protected final static Component component;
protected final static MediaTracker tracker; protected final static MediaTracker tracker;
static { static {
component = new Component() {}; component = AccessController.doPrivileged(new PrivilegedAction<Component>() {
AccessController.doPrivileged(new PrivilegedAction<Object>() { public Component run() {
public Object run() {
try { try {
final Component component = createNoPermsComponent();
// 6482575 - clear the appContext field so as not to leak it // 6482575 - clear the appContext field so as not to leak it
Field appContextField = Field appContextField =
Component.class.getDeclaredField("appContext"); Component.class.getDeclaredField("appContext");
appContextField.setAccessible(true); appContextField.setAccessible(true);
appContextField.set(component, null); appContextField.set(component, null);
}
catch (NoSuchFieldException e) { return component;
e.printStackTrace(); } catch (Throwable e) {
} // We don't care about component.
catch (IllegalAccessException e) { // So don't prevent class initialisation.
e.printStackTrace(); e.printStackTrace();
}
return null; return null;
} }
}
}); });
tracker = new MediaTracker(component); 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<Component>() {
public Component run() {
return new Component() {
};
}
},
new AccessControlContext(new ProtectionDomain[]{
new ProtectionDomain(null, null)
})
);
}
/** /**
* Id used in loading images from MediaTracker. * Id used in loading images from MediaTracker.
*/ */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册