--- a/jdk/src/java.desktop/share/classes/sun/awt/image/ImageWatched.java Mon Feb 06 15:31:37 2017 -0800
+++ b/jdk/src/java.desktop/share/classes/sun/awt/image/ImageWatched.java Sun Feb 12 08:10:34 2017 -0800
@@ -29,6 +29,10 @@
import java.awt.Image;
import java.awt.image.ImageObserver;
+import java.security.AccessControlContext;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+
public abstract class ImageWatched {
public static Link endlink = new Link();
@@ -85,16 +89,26 @@
}
}
+ static class AccWeakReference<T> extends WeakReference<T> {
+
+ private final AccessControlContext acc;
+
+ AccWeakReference(T ref) {
+ super(ref);
+ acc = AccessController.getContext();
+ }
+ }
+
/*
* Standard Link implementation to manage a Weak Reference
* to an ImageObserver.
*/
public static class WeakLink extends Link {
- private WeakReference<ImageObserver> myref;
+ private final AccWeakReference<ImageObserver> myref;
private Link next;
public WeakLink(ImageObserver obs, Link next) {
- myref = new WeakReference<ImageObserver>(obs);
+ myref = new AccWeakReference<ImageObserver>(obs);
this.next = next;
}
@@ -120,6 +134,19 @@
return this;
}
+ private static boolean update(ImageObserver iw, AccessControlContext acc,
+ Image img, int info,
+ int x, int y, int w, int h) {
+
+ if (acc != null || System.getSecurityManager() != null) {
+ return AccessController.doPrivileged(
+ (PrivilegedAction<Boolean>) () -> {
+ return iw.imageUpdate(img, info, x, y, w, h);
+ }, acc);
+ }
+ return false;
+ }
+
public boolean newInfo(Image img, int info,
int x, int y, int w, int h)
{
@@ -129,7 +156,7 @@
if (myiw == null) {
// My referent is null so we must prune in a second pass.
ret = true;
- } else if (myiw.imageUpdate(img, info, x, y, w, h) == false) {
+ } else if (update(myiw, myref.acc, img, info, x, y, w, h) == false) {
// My referent has lost interest so clear it and ask
// for a pruning pass to remove it later.
myref.clear();