# HG changeset patch # User prr # Date 1486915834 28800 # Node ID d188affa1add6580fb3c3e46ef4a18ae0fea9a6c # Parent 6c01ea8d693025c9078da52a14181866d8987b2b 8174098: Better image fetching Reviewed-by: serb, vadim, skoivu diff -r 6c01ea8d6930 -r d188affa1add src/java.desktop/share/classes/sun/awt/image/ImageWatched.java --- a/src/java.desktop/share/classes/sun/awt/image/ImageWatched.java Mon Feb 06 15:31:37 2017 -0800 +++ b/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 extends WeakReference { + + 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 myref; + private final AccWeakReference myref; private Link next; public WeakLink(ImageObserver obs, Link next) { - myref = new WeakReference(obs); + myref = new AccWeakReference(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) () -> { + 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();