changeset 2376:56926153f83b

S7112642: Incorrect checking for graphics rendering object (--enable-xrender only) 2012-02-10 Andrew John Hughes <ahughes@redhat.com> * Makefile.am: Apply 7112642 security patch when XRender is enabled. * patches/security/20120214/7112642.patch: Additional security patch.
author Andrew John Hughes <ahughes@redhat.com>
date Fri, 10 Feb 2012 14:44:39 +0000
parents 150156323417
children 847d06cccadf
files ChangeLog Makefile.am patches/security/20120214/7112642.patch
diffstat 3 files changed, 761 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Thu Feb 09 18:49:32 2012 +0000
+++ b/ChangeLog	Fri Feb 10 14:44:39 2012 +0000
@@ -1,3 +1,10 @@
+2012-02-10  Andrew John Hughes  <ahughes@redhat.com>
+
+	* Makefile.am: Apply 7112642 security patch
+	when XRender is enabled.
+	* patches/security/20120214/7112642.patch:
+	Additional security patch.
+
 2012-02-09  Andrew John Hughes  <ahughes@redhat.com>
 
 	* NEWS: Set release date for 1.9.13.
--- a/Makefile.am	Thu Feb 09 18:49:32 2012 +0000
+++ b/Makefile.am	Fri Feb 10 14:44:39 2012 +0000
@@ -258,6 +258,8 @@
 	patches/security/20120214/7118283.patch \
 	patches/security/20120214/7126960.patch
 
+SPECIAL_SECURITY_PATCH = patches/security/20120214/7112642.patch
+
 ICEDTEA_PATCHES = \
 	$(SECURITY_PATCHES) \
 	patches/stdc-limit-macros.patch \
@@ -437,7 +439,8 @@
 	patches/openjdk/6307603-xrender-01.patch \
 	patches/openjdk/6961633-xrender-02.patch \
         patches/openjdk/6791612-opengl-jni-fix.patch \
-        patches/openjdk/6755274-glgetstring-crash.patch
+        patches/openjdk/6755274-glgetstring-crash.patch \
+	$(SPECIAL_SECURITY_PATCH)
 endif
 
 if ENABLE_NIO2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/patches/security/20120214/7112642.patch	Fri Feb 10 14:44:39 2012 +0000
@@ -0,0 +1,750 @@
+# HG changeset patch
+# User bagiras
+# Date 1322689157 28800
+# Node ID 17eb322778160cc1463875e2b429211cf7966997
+# Parent  42706fbe23df228d55c454d0fbf8c3fb36fc4bc6
+7112642: Incorrect checking for graphics rendering object
+Reviewed-by: art, bae, flar, prr
+
+diff --git a/src/share/classes/sun/java2d/SunGraphics2D.java b/src/share/classes/sun/java2d/SunGraphics2D.java
+--- openjdk/jdk/src/share/classes/sun/java2d/SunGraphics2D.java
++++ openjdk/jdk/src/share/classes/sun/java2d/SunGraphics2D.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1996, 2008, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
+  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+  *
+  * This code is free software; you can redistribute it and/or modify it
+@@ -370,6 +370,17 @@ public final class SunGraphics2D
+     }
+ 
+     public void validatePipe() {
++        /* This workaround is for the situation when we update the Pipelines
++         * for invalid SurfaceData and run further code when the current
++         * pipeline doesn't support the type of new SurfaceData created during
++         * the current pipeline's work (in place of the invalid SurfaceData).
++         * Usually SurfaceData and Pipelines are repaired (through revalidateAll)
++         * and called again in the exception handlers */
++
++        if (!surfaceData.isValid()) {
++            throw new InvalidPipeException("attempt to validate Pipe with invalid SurfaceData");
++        }
++
+         surfaceData.validatePipe(this);
+     }
+ 
+diff --git a/src/share/classes/sun/java2d/opengl/OGLRenderer.java b/src/share/classes/sun/java2d/opengl/OGLRenderer.java
+--- openjdk/jdk/src/share/classes/sun/java2d/opengl/OGLRenderer.java
++++ openjdk/jdk/src/share/classes/sun/java2d/opengl/OGLRenderer.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+  *
+  * This code is free software; you can redistribute it and/or modify it
+@@ -27,6 +27,7 @@ package sun.java2d.opengl;
+ 
+ import java.awt.Transparency;
+ import java.awt.geom.Path2D;
++import sun.java2d.InvalidPipeException;
+ import sun.java2d.SunGraphics2D;
+ import sun.java2d.loops.GraphicsPrimitive;
+ import sun.java2d.pipe.BufferedRenderPipe;
+@@ -46,7 +47,12 @@ class OGLRenderer extends BufferedRender
+         int ctxflags =
+             sg2d.paint.getTransparency() == Transparency.OPAQUE ?
+                 OGLContext.SRC_IS_OPAQUE : OGLContext.NO_CONTEXT_FLAGS;
+-        OGLSurfaceData dstData = (OGLSurfaceData)sg2d.surfaceData;
++        OGLSurfaceData dstData;
++        try {
++            dstData = (OGLSurfaceData)sg2d.surfaceData;
++        } catch (ClassCastException e) {
++            throw new InvalidPipeException("wrong surface data type: " + sg2d.surfaceData);
++        }
+         OGLContext.validateContext(dstData, dstData,
+                                    sg2d.getCompClip(), sg2d.composite,
+                                    null, sg2d.paint, sg2d, ctxflags);
+@@ -55,7 +61,12 @@ class OGLRenderer extends BufferedRender
+     @Override
+     protected void validateContextAA(SunGraphics2D sg2d) {
+         int ctxflags = OGLContext.NO_CONTEXT_FLAGS;
+-        OGLSurfaceData dstData = (OGLSurfaceData)sg2d.surfaceData;
++        OGLSurfaceData dstData;
++        try {
++            dstData = (OGLSurfaceData)sg2d.surfaceData;
++        } catch (ClassCastException e) {
++            throw new InvalidPipeException("wrong surface data type: " + sg2d.surfaceData);
++        }
+         OGLContext.validateContext(dstData, dstData,
+                                    sg2d.getCompClip(), sg2d.composite,
+                                    null, sg2d.paint, sg2d, ctxflags);
+@@ -69,7 +80,12 @@ class OGLRenderer extends BufferedRender
+             int ctxflags =
+                 sg2d.surfaceData.getTransparency() == Transparency.OPAQUE ?
+                     OGLContext.SRC_IS_OPAQUE : OGLContext.NO_CONTEXT_FLAGS;
+-            OGLSurfaceData dstData = (OGLSurfaceData)sg2d.surfaceData;
++            OGLSurfaceData dstData;
++            try {
++                dstData = (OGLSurfaceData)sg2d.surfaceData;
++            } catch (ClassCastException e) {
++                throw new InvalidPipeException("wrong surface data type: " + sg2d.surfaceData);
++            }
+             OGLContext.validateContext(dstData, dstData,
+                                        sg2d.getCompClip(), sg2d.composite,
+                                        null, null, null, ctxflags);
+diff --git a/src/share/classes/sun/java2d/pipe/BufferedContext.java b/src/share/classes/sun/java2d/pipe/BufferedContext.java
+--- openjdk/jdk/src/share/classes/sun/java2d/pipe/BufferedContext.java
++++ openjdk/jdk/src/share/classes/sun/java2d/pipe/BufferedContext.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
+  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+  *
+  * This code is free software; you can redistribute it and/or modify it
+@@ -111,6 +111,8 @@ public abstract class BufferedContext {
+      *
+      * Note: must be called while the RenderQueue lock is held.
+      *
++     * It's assumed that the type of surfaces has been checked by the Renderer
++     *
+      * @throws InvalidPipeException if either src or dest surface is not valid
+      * or lost
+      * @see RenderQueue#lock
+@@ -134,6 +136,8 @@ public abstract class BufferedContext {
+      * and disables all context state settings.
+      *
+      * Note: must be called while the RenderQueue lock is held.
++     *
++     * It's assumed that the type of surfaces has been checked by the Renderer
+      *
+      * @throws InvalidPipeException if the surface is not valid
+      * or lost
+@@ -159,6 +163,8 @@ public abstract class BufferedContext {
+      * is safe to pass a null SunGraphics2D and it will be ignored.
+      *
+      * Note: must be called while the RenderQueue lock is held.
++     *
++     * It's assumed that the type of surfaces has been checked by the Renderer
+      *
+      * @throws InvalidPipeException if either src or dest surface is not valid
+      * or lost
+diff --git a/src/windows/classes/sun/java2d/d3d/D3DRenderer.java b/src/windows/classes/sun/java2d/d3d/D3DRenderer.java
+--- openjdk/jdk/src/windows/classes/sun/java2d/d3d/D3DRenderer.java
++++ openjdk/jdk/src/windows/classes/sun/java2d/d3d/D3DRenderer.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
+  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+  *
+  * This code is free software; you can redistribute it and/or modify it
+@@ -27,6 +27,7 @@ package sun.java2d.d3d;
+ 
+ import java.awt.Transparency;
+ import java.awt.geom.Path2D;
++import sun.java2d.InvalidPipeException;
+ import sun.java2d.SunGraphics2D;
+ import sun.java2d.loops.GraphicsPrimitive;
+ import sun.java2d.pipe.BufferedPaints;
+@@ -47,7 +48,12 @@ class D3DRenderer extends BufferedRender
+         int ctxflags =
+             sg2d.paint.getTransparency() == Transparency.OPAQUE ?
+                 D3DContext.SRC_IS_OPAQUE : D3DContext.NO_CONTEXT_FLAGS;
+-        D3DSurfaceData dstData = (D3DSurfaceData)sg2d.surfaceData;
++        D3DSurfaceData dstData;
++        try {
++            dstData = (D3DSurfaceData)sg2d.surfaceData;
++        } catch (ClassCastException e) {
++            throw new InvalidPipeException("wrong surface data type: " + sg2d.surfaceData);
++        }
+         D3DContext.validateContext(dstData, dstData,
+                                    sg2d.getCompClip(), sg2d.composite,
+                                    null, sg2d.paint, sg2d, ctxflags);
+@@ -56,7 +62,12 @@ class D3DRenderer extends BufferedRender
+     @Override
+     protected void validateContextAA(SunGraphics2D sg2d) {
+         int ctxflags = D3DContext.NO_CONTEXT_FLAGS;
+-        D3DSurfaceData dstData = (D3DSurfaceData)sg2d.surfaceData;
++        D3DSurfaceData dstData;
++        try {
++            dstData = (D3DSurfaceData)sg2d.surfaceData;
++        } catch (ClassCastException e) {
++            throw new InvalidPipeException("wrong surface data type: " + sg2d.surfaceData);
++        }
+         D3DContext.validateContext(dstData, dstData,
+                                    sg2d.getCompClip(), sg2d.composite,
+                                    null, sg2d.paint, sg2d, ctxflags);
+@@ -70,7 +81,12 @@ class D3DRenderer extends BufferedRender
+             int ctxflags =
+                 sg2d.surfaceData.getTransparency() == Transparency.OPAQUE ?
+                     D3DContext.SRC_IS_OPAQUE : D3DContext.NO_CONTEXT_FLAGS;
+-            D3DSurfaceData dstData = (D3DSurfaceData)sg2d.surfaceData;
++            D3DSurfaceData dstData;
++            try {
++                dstData = (D3DSurfaceData)sg2d.surfaceData;
++            } catch (ClassCastException e) {
++                throw new InvalidPipeException("wrong surface data type: " + sg2d.surfaceData);
++            }
+             D3DContext.validateContext(dstData, dstData,
+                                        sg2d.getCompClip(), sg2d.composite,
+                                        null, null, null, ctxflags);
+diff --git a/src/windows/classes/sun/java2d/windows/GDIRenderer.java b/src/windows/classes/sun/java2d/windows/GDIRenderer.java
+--- openjdk/jdk/src/windows/classes/sun/java2d/windows/GDIRenderer.java
++++ openjdk/jdk/src/windows/classes/sun/java2d/windows/GDIRenderer.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1999, 2006, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+  *
+  * This code is free software; you can redistribute it and/or modify it
+@@ -29,6 +29,7 @@ import java.awt.Shape;
+ import java.awt.Shape;
+ import java.awt.geom.Path2D;
+ import java.awt.geom.PathIterator;
++import sun.java2d.InvalidPipeException;
+ import sun.java2d.SunGraphics2D;
+ import sun.java2d.SurfaceData;
+ import sun.java2d.pipe.Region;
+@@ -45,7 +46,7 @@ public class GDIRenderer implements
+     PixelFillPipe,
+     ShapeDrawPipe
+ {
+-    native void doDrawLine(SurfaceData sData,
++    native void doDrawLine(GDIWindowSurfaceData sData,
+                            Region clip, Composite comp, int color,
+                            int x1, int y1, int x2, int y2);
+ 
+@@ -54,24 +55,32 @@ public class GDIRenderer implements
+     {
+         int transx = sg2d.transX;
+         int transy = sg2d.transY;
+-        doDrawLine(sg2d.surfaceData,
+-                   sg2d.getCompClip(), sg2d.composite, sg2d.eargb,
+-                   x1+transx, y1+transy, x2+transx, y2+transy);
++        try {
++            doDrawLine((GDIWindowSurfaceData)sg2d.surfaceData,
++                       sg2d.getCompClip(), sg2d.composite, sg2d.eargb,
++                       x1+transx, y1+transy, x2+transx, y2+transy);
++        } catch (ClassCastException e) {
++            throw new InvalidPipeException("wrong surface data type: " + sg2d.surfaceData);
++        }
+     }
+ 
+-    native void doDrawRect(SurfaceData sData,
++    native void doDrawRect(GDIWindowSurfaceData sData,
+                            Region clip, Composite comp, int color,
+                            int x, int y, int w, int h);
+ 
+     public void drawRect(SunGraphics2D sg2d,
+                          int x, int y, int width, int height)
+     {
+-        doDrawRect(sg2d.surfaceData,
+-                   sg2d.getCompClip(), sg2d.composite, sg2d.eargb,
+-                   x+sg2d.transX, y+sg2d.transY, width, height);
++        try {
++            doDrawRect((GDIWindowSurfaceData)sg2d.surfaceData,
++                       sg2d.getCompClip(), sg2d.composite, sg2d.eargb,
++                       x+sg2d.transX, y+sg2d.transY, width, height);
++        } catch (ClassCastException e) {
++            throw new InvalidPipeException("wrong surface data type: " + sg2d.surfaceData);
++        }
+     }
+ 
+-    native void doDrawRoundRect(SurfaceData sData,
++    native void doDrawRoundRect(GDIWindowSurfaceData sData,
+                                 Region clip, Composite comp, int color,
+                                 int x, int y, int w, int h,
+                                 int arcW, int arcH);
+@@ -80,25 +89,33 @@ public class GDIRenderer implements
+                               int x, int y, int width, int height,
+                               int arcWidth, int arcHeight)
+     {
+-        doDrawRoundRect(sg2d.surfaceData,
+-                        sg2d.getCompClip(), sg2d.composite, sg2d.eargb,
+-                        x+sg2d.transX, y+sg2d.transY, width, height,
+-                        arcWidth, arcHeight);
++        try {
++            doDrawRoundRect((GDIWindowSurfaceData)sg2d.surfaceData,
++                            sg2d.getCompClip(), sg2d.composite, sg2d.eargb,
++                            x+sg2d.transX, y+sg2d.transY, width, height,
++                            arcWidth, arcHeight);
++        } catch (ClassCastException e) {
++            throw new InvalidPipeException("wrong surface data type: " + sg2d.surfaceData);
++        }
+     }
+ 
+-    native void doDrawOval(SurfaceData sData,
++    native void doDrawOval(GDIWindowSurfaceData sData,
+                            Region clip, Composite comp, int color,
+                            int x, int y, int w, int h);
+ 
+     public void drawOval(SunGraphics2D sg2d,
+                          int x, int y, int width, int height)
+     {
+-        doDrawOval(sg2d.surfaceData,
+-                   sg2d.getCompClip(), sg2d.composite, sg2d.eargb,
+-                   x+sg2d.transX, y+sg2d.transY, width, height);
++        try {
++            doDrawOval((GDIWindowSurfaceData)sg2d.surfaceData,
++                       sg2d.getCompClip(), sg2d.composite, sg2d.eargb,
++                       x+sg2d.transX, y+sg2d.transY, width, height);
++        } catch (ClassCastException e) {
++            throw new InvalidPipeException("wrong surface data type: " + sg2d.surfaceData);
++        }
+     }
+ 
+-    native void doDrawArc(SurfaceData sData,
++    native void doDrawArc(GDIWindowSurfaceData sData,
+                           Region clip, Composite comp, int color,
+                           int x, int y, int w, int h,
+                           int angleStart, int angleExtent);
+@@ -107,13 +124,17 @@ public class GDIRenderer implements
+                         int x, int y, int width, int height,
+                         int startAngle, int arcAngle)
+     {
+-        doDrawArc(sg2d.surfaceData,
+-                  sg2d.getCompClip(), sg2d.composite, sg2d.eargb,
+-                  x+sg2d.transX, y+sg2d.transY, width, height,
+-                  startAngle, arcAngle);
++        try {
++            doDrawArc((GDIWindowSurfaceData)sg2d.surfaceData,
++                      sg2d.getCompClip(), sg2d.composite, sg2d.eargb,
++                      x+sg2d.transX, y+sg2d.transY, width, height,
++                      startAngle, arcAngle);
++        } catch (ClassCastException e) {
++            throw new InvalidPipeException("wrong surface data type: " + sg2d.surfaceData);
++        }
+     }
+ 
+-    native void doDrawPoly(SurfaceData sData,
++    native void doDrawPoly(GDIWindowSurfaceData sData,
+                            Region clip, Composite comp, int color,
+                            int transx, int transy,
+                            int[] xpoints, int[] ypoints,
+@@ -123,33 +144,45 @@ public class GDIRenderer implements
+                              int xpoints[], int ypoints[],
+                              int npoints)
+     {
+-        doDrawPoly(sg2d.surfaceData,
+-                   sg2d.getCompClip(), sg2d.composite, sg2d.eargb,
+-                   sg2d.transX, sg2d.transY, xpoints, ypoints, npoints, false);
++        try {
++            doDrawPoly((GDIWindowSurfaceData)sg2d.surfaceData,
++                       sg2d.getCompClip(), sg2d.composite, sg2d.eargb,
++                       sg2d.transX, sg2d.transY, xpoints, ypoints, npoints, false);
++        } catch (ClassCastException e) {
++            throw new InvalidPipeException("wrong surface data type: " + sg2d.surfaceData);
++        }
+     }
+ 
+     public void drawPolygon(SunGraphics2D sg2d,
+                             int xpoints[], int ypoints[],
+                             int npoints)
+     {
+-        doDrawPoly(sg2d.surfaceData,
+-                   sg2d.getCompClip(), sg2d.composite, sg2d.eargb,
+-                   sg2d.transX, sg2d.transY, xpoints, ypoints, npoints, true);
++        try {
++            doDrawPoly((GDIWindowSurfaceData)sg2d.surfaceData,
++                       sg2d.getCompClip(), sg2d.composite, sg2d.eargb,
++                       sg2d.transX, sg2d.transY, xpoints, ypoints, npoints, true);
++        } catch (ClassCastException e) {
++            throw new InvalidPipeException("wrong surface data type: " + sg2d.surfaceData);
++        }
+     }
+ 
+-    native void doFillRect(SurfaceData sData,
++    native void doFillRect(GDIWindowSurfaceData sData,
+                            Region clip, Composite comp, int color,
+                            int x, int y, int w, int h);
+ 
+     public void fillRect(SunGraphics2D sg2d,
+                          int x, int y, int width, int height)
+     {
+-        doFillRect(sg2d.surfaceData,
+-                   sg2d.getCompClip(), sg2d.composite, sg2d.eargb,
+-                   x+sg2d.transX, y+sg2d.transY, width, height);
++        try {
++            doFillRect((GDIWindowSurfaceData)sg2d.surfaceData,
++                       sg2d.getCompClip(), sg2d.composite, sg2d.eargb,
++                       x+sg2d.transX, y+sg2d.transY, width, height);
++        } catch (ClassCastException e) {
++            throw new InvalidPipeException("wrong surface data type: " + sg2d.surfaceData);
++        }
+     }
+ 
+-    native void doFillRoundRect(SurfaceData sData,
++    native void doFillRoundRect(GDIWindowSurfaceData sData,
+                                 Region clip, Composite comp, int color,
+                                 int x, int y, int w, int h,
+                                 int arcW, int arcH);
+@@ -158,25 +191,33 @@ public class GDIRenderer implements
+                               int x, int y, int width, int height,
+                               int arcWidth, int arcHeight)
+     {
+-        doFillRoundRect(sg2d.surfaceData,
+-                        sg2d.getCompClip(), sg2d.composite, sg2d.eargb,
+-                        x+sg2d.transX, y+sg2d.transY, width, height,
+-                        arcWidth, arcHeight);
++        try {
++            doFillRoundRect((GDIWindowSurfaceData)sg2d.surfaceData,
++                            sg2d.getCompClip(), sg2d.composite, sg2d.eargb,
++                            x+sg2d.transX, y+sg2d.transY, width, height,
++                            arcWidth, arcHeight);
++        } catch (ClassCastException e) {
++            throw new InvalidPipeException("wrong surface data type: " + sg2d.surfaceData);
++        }
+     }
+ 
+-    native void doFillOval(SurfaceData sData,
++    native void doFillOval(GDIWindowSurfaceData sData,
+                            Region clip, Composite comp, int color,
+                            int x, int y, int w, int h);
+ 
+     public void fillOval(SunGraphics2D sg2d,
+                          int x, int y, int width, int height)
+     {
+-        doFillOval(sg2d.surfaceData,
+-                   sg2d.getCompClip(), sg2d.composite, sg2d.eargb,
+-                   x+sg2d.transX, y+sg2d.transY, width, height);
++        try {
++            doFillOval((GDIWindowSurfaceData)sg2d.surfaceData,
++                       sg2d.getCompClip(), sg2d.composite, sg2d.eargb,
++                       x+sg2d.transX, y+sg2d.transY, width, height);
++        } catch (ClassCastException e) {
++            throw new InvalidPipeException("wrong surface data type: " + sg2d.surfaceData);
++        }
+     }
+ 
+-    native void doFillArc(SurfaceData sData,
++    native void doFillArc(GDIWindowSurfaceData sData,
+                           Region clip, Composite comp, int color,
+                           int x, int y, int w, int h,
+                           int angleStart, int angleExtent);
+@@ -185,13 +226,17 @@ public class GDIRenderer implements
+                         int x, int y, int width, int height,
+                         int startAngle, int arcAngle)
+     {
+-        doFillArc(sg2d.surfaceData,
+-                  sg2d.getCompClip(), sg2d.composite, sg2d.eargb,
+-                  x+sg2d.transX, y+sg2d.transY, width, height,
+-                  startAngle, arcAngle);
++        try {
++            doFillArc((GDIWindowSurfaceData)sg2d.surfaceData,
++                      sg2d.getCompClip(), sg2d.composite, sg2d.eargb,
++                      x+sg2d.transX, y+sg2d.transY, width, height,
++                      startAngle, arcAngle);
++        } catch (ClassCastException e) {
++            throw new InvalidPipeException("wrong surface data type: " + sg2d.surfaceData);
++        }
+     }
+ 
+-    native void doFillPoly(SurfaceData sData,
++    native void doFillPoly(GDIWindowSurfaceData sData,
+                            Region clip, Composite comp, int color,
+                            int transx, int transy,
+                            int[] xpoints, int[] ypoints,
+@@ -201,12 +246,16 @@ public class GDIRenderer implements
+                             int xpoints[], int ypoints[],
+                             int npoints)
+     {
+-        doFillPoly(sg2d.surfaceData,
+-                   sg2d.getCompClip(), sg2d.composite, sg2d.eargb,
+-                   sg2d.transX, sg2d.transY, xpoints, ypoints, npoints);
++        try {
++            doFillPoly((GDIWindowSurfaceData)sg2d.surfaceData,
++                       sg2d.getCompClip(), sg2d.composite, sg2d.eargb,
++                       sg2d.transX, sg2d.transY, xpoints, ypoints, npoints);
++        } catch (ClassCastException e) {
++            throw new InvalidPipeException("wrong surface data type: " + sg2d.surfaceData);
++        }
+     }
+ 
+-    native void doShape(SurfaceData sData,
++    native void doShape(GDIWindowSurfaceData sData,
+                         Region clip, Composite comp, int color,
+                         int transX, int transY,
+                         Path2D.Float p2df, boolean isfill);
+@@ -228,9 +277,13 @@ public class GDIRenderer implements
+             transX = 0;
+             transY = 0;
+         }
+-        doShape(sg2d.surfaceData,
+-                sg2d.getCompClip(), sg2d.composite, sg2d.eargb,
+-                transX, transY, p2df, isfill);
++        try {
++            doShape((GDIWindowSurfaceData)sg2d.surfaceData,
++                    sg2d.getCompClip(), sg2d.composite, sg2d.eargb,
++                    transX, transY, p2df, isfill);
++        } catch (ClassCastException e) {
++            throw new InvalidPipeException("wrong surface data type: " + sg2d.surfaceData);
++        }
+     }
+ 
+     // REMIND: This is just a hack to get WIDE lines to honor the
+@@ -239,7 +292,12 @@ public class GDIRenderer implements
+     // method that could be filled by the doShape method more quickly.
+     public void doFillSpans(SunGraphics2D sg2d, SpanIterator si) {
+         int box[] = new int[4];
+-        SurfaceData sd = sg2d.surfaceData;
++        GDIWindowSurfaceData sd;
++        try {
++            sd = (GDIWindowSurfaceData)sg2d.surfaceData;
++        } catch (ClassCastException e) {
++            throw new InvalidPipeException("wrong surface data type: " + sg2d.surfaceData);
++        }
+         Region clip = sg2d.getCompClip();
+         Composite comp = sg2d.composite;
+         int eargb = sg2d.eargb;
+@@ -268,7 +326,7 @@ public class GDIRenderer implements
+         doShape(sg2d, s, true);
+     }
+ 
+-    public native void devCopyArea(SurfaceData sData,
++    public native void devCopyArea(GDIWindowSurfaceData sData,
+                                    int srcx, int srcy,
+                                    int dx, int dy,
+                                    int w, int h);
+@@ -278,21 +336,21 @@ public class GDIRenderer implements
+     }
+ 
+     public static class Tracer extends GDIRenderer {
+-        void doDrawLine(SurfaceData sData,
++        void doDrawLine(GDIWindowSurfaceData sData,
+                         Region clip, Composite comp, int color,
+                         int x1, int y1, int x2, int y2)
+         {
+             GraphicsPrimitive.tracePrimitive("GDIDrawLine");
+             super.doDrawLine(sData, clip, comp, color, x1, y1, x2, y2);
+         }
+-        void doDrawRect(SurfaceData sData,
++        void doDrawRect(GDIWindowSurfaceData sData,
+                         Region clip, Composite comp, int color,
+                         int x, int y, int w, int h)
+         {
+             GraphicsPrimitive.tracePrimitive("GDIDrawRect");
+             super.doDrawRect(sData, clip, comp, color, x, y, w, h);
+         }
+-        void doDrawRoundRect(SurfaceData sData,
++        void doDrawRoundRect(GDIWindowSurfaceData sData,
+                              Region clip, Composite comp, int color,
+                              int x, int y, int w, int h,
+                              int arcW, int arcH)
+@@ -301,14 +359,14 @@ public class GDIRenderer implements
+             super.doDrawRoundRect(sData, clip, comp, color,
+                                   x, y, w, h, arcW, arcH);
+         }
+-        void doDrawOval(SurfaceData sData,
++        void doDrawOval(GDIWindowSurfaceData sData,
+                         Region clip, Composite comp, int color,
+                         int x, int y, int w, int h)
+         {
+             GraphicsPrimitive.tracePrimitive("GDIDrawOval");
+             super.doDrawOval(sData, clip, comp, color, x, y, w, h);
+         }
+-        void doDrawArc(SurfaceData sData,
++        void doDrawArc(GDIWindowSurfaceData sData,
+                        Region clip, Composite comp, int color,
+                        int x, int y, int w, int h,
+                        int angleStart, int angleExtent)
+@@ -317,7 +375,7 @@ public class GDIRenderer implements
+             super.doDrawArc(sData, clip, comp, color, x, y, w, h,
+                             angleStart, angleExtent);
+         }
+-        void doDrawPoly(SurfaceData sData,
++        void doDrawPoly(GDIWindowSurfaceData sData,
+                         Region clip, Composite comp, int color,
+                         int transx, int transy,
+                         int[] xpoints, int[] ypoints,
+@@ -327,14 +385,14 @@ public class GDIRenderer implements
+             super.doDrawPoly(sData, clip, comp, color, transx, transy,
+                              xpoints, ypoints, npoints, isclosed);
+         }
+-        void doFillRect(SurfaceData sData,
++        void doFillRect(GDIWindowSurfaceData sData,
+                         Region clip, Composite comp, int color,
+                         int x, int y, int w, int h)
+         {
+             GraphicsPrimitive.tracePrimitive("GDIFillRect");
+             super.doFillRect(sData, clip, comp, color, x, y, w, h);
+         }
+-        void doFillRoundRect(SurfaceData sData,
++        void doFillRoundRect(GDIWindowSurfaceData sData,
+                              Region clip, Composite comp, int color,
+                              int x, int y, int w, int h,
+                              int arcW, int arcH)
+@@ -343,14 +401,14 @@ public class GDIRenderer implements
+             super.doFillRoundRect(sData, clip, comp, color,
+                                   x, y, w, h, arcW, arcH);
+         }
+-        void doFillOval(SurfaceData sData,
++        void doFillOval(GDIWindowSurfaceData sData,
+                         Region clip, Composite comp, int color,
+                         int x, int y, int w, int h)
+         {
+             GraphicsPrimitive.tracePrimitive("GDIFillOval");
+             super.doFillOval(sData, clip, comp, color, x, y, w, h);
+         }
+-        void doFillArc(SurfaceData sData,
++        void doFillArc(GDIWindowSurfaceData sData,
+                        Region clip, Composite comp, int color,
+                        int x, int y, int w, int h,
+                        int angleStart, int angleExtent)
+@@ -359,7 +417,7 @@ public class GDIRenderer implements
+             super.doFillArc(sData, clip, comp, color, x, y, w, h,
+                             angleStart, angleExtent);
+         }
+-        void doFillPoly(SurfaceData sData,
++        void doFillPoly(GDIWindowSurfaceData sData,
+                         Region clip, Composite comp, int color,
+                         int transx, int transy,
+                         int[] xpoints, int[] ypoints,
+@@ -369,7 +427,7 @@ public class GDIRenderer implements
+             super.doFillPoly(sData, clip, comp, color, transx, transy,
+                              xpoints, ypoints, npoints);
+         }
+-        void doShape(SurfaceData sData,
++        void doShape(GDIWindowSurfaceData sData,
+                      Region clip, Composite comp, int color,
+                      int transX, int transY,
+                      Path2D.Float p2df, boolean isfill)
+@@ -380,7 +438,7 @@ public class GDIRenderer implements
+             super.doShape(sData, clip, comp, color,
+                           transX, transY, p2df, isfill);
+         }
+-        public void devCopyArea(SurfaceData sData,
++        public void devCopyArea(GDIWindowSurfaceData sData,
+                                 int srcx, int srcy,
+                                 int dx, int dy,
+                                 int w, int h)
+diff --git a/src/windows/native/sun/java2d/windows/GDIRenderer.cpp b/src/windows/native/sun/java2d/windows/GDIRenderer.cpp
+--- openjdk/jdk/src/windows/native/sun/java2d/windows/GDIRenderer.cpp
++++ openjdk/jdk/src/windows/native/sun/java2d/windows/GDIRenderer.cpp
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+  *
+  * This code is free software; you can redistribute it and/or modify it
+@@ -117,7 +117,7 @@ static POINT *TransformPoly(jint *xpoint
+ /*
+  * Class:     sun_java2d_windows_GDIRenderer
+  * Method:    doDrawLine
+- * Signature: (Lsun/java2d/SurfaceData;Lsun/java2d/pipe/Region;Ljava/awt/Composite;IIIII)V
++ * Signature: (Lsun/java2d/windows/GDIWindowSurfaceData;Lsun/java2d/pipe/Region;Ljava/awt/Composite;IIIII)V
+  */
+ JNIEXPORT void JNICALL
+ Java_sun_java2d_windows_GDIRenderer_doDrawLine
+@@ -164,7 +164,7 @@ Java_sun_java2d_windows_GDIRenderer_doDr
+ /*
+  * Class:     sun_java2d_windows_GDIRenderer
+  * Method:    doDrawRect
+- * Signature: (Lsun/java2d/SurfaceData;Lsun/java2d/pipe/Region;Ljava/awt/Composite;IIIII)V
++ * Signature: (Lsun/java2d/windows/GDIWindowSurfaceData;Lsun/java2d/pipe/Region;Ljava/awt/Composite;IIIII)V
+  */
+ JNIEXPORT void JNICALL
+ Java_sun_java2d_windows_GDIRenderer_doDrawRect
+@@ -209,7 +209,7 @@ Java_sun_java2d_windows_GDIRenderer_doDr
+ /*
+  * Class:     sun_java2d_windows_GDIRenderer
+  * Method:    doDrawRoundRect
+- * Signature: (Lsun/java2d/SurfaceData;Lsun/java2d/pipe/Region;Ljava/awt/Composite;IIIIIII)V
++ * Signature: (Lsun/java2d/windows/GDIWindowSurfaceData;Lsun/java2d/pipe/Region;Ljava/awt/Composite;IIIIIII)V
+  */
+ JNIEXPORT void JNICALL
+ Java_sun_java2d_windows_GDIRenderer_doDrawRoundRect
+@@ -253,7 +253,7 @@ Java_sun_java2d_windows_GDIRenderer_doDr
+ /*
+  * Class:     sun_java2d_windows_GDIRenderer
+  * Method:    doDrawOval
+- * Signature: (Lsun/java2d/SurfaceData;Lsun/java2d/pipe/Region;Ljava/awt/Composite;IIIII)V
++ * Signature: (Lsun/java2d/windows/GDIWindowSurfaceData;Lsun/java2d/pipe/Region;Ljava/awt/Composite;IIIII)V
+  */
+ JNIEXPORT void JNICALL
+ Java_sun_java2d_windows_GDIRenderer_doDrawOval
+@@ -291,7 +291,7 @@ Java_sun_java2d_windows_GDIRenderer_doDr
+ /*
+  * Class:     sun_java2d_windows_GDIRenderer
+  * Method:    doDrawArc
+- * Signature: (Lsun/java2d/SurfaceData;Lsun/java2d/pipe/Region;Ljava/awt/Composite;IIIIIII)V
++ * Signature: (Lsun/java2d/windows/GDIWindowSurfaceData;Lsun/java2d/pipe/Region;Ljava/awt/Composite;IIIIIII)V
+  */
+ JNIEXPORT void JNICALL
+ Java_sun_java2d_windows_GDIRenderer_doDrawArc
+@@ -347,7 +347,7 @@ Java_sun_java2d_windows_GDIRenderer_doDr
+ /*
+  * Class:     sun_java2d_windows_GDIRenderer
+  * Method:    doDrawPoly
+- * Signature: (Lsun/java2d/SurfaceData;Lsun/java2d/pipe/Region;Ljava/awt/Composite;III[I[IIZ)V
++ * Signature: (Lsun/java2d/windows/GDIWindowSurfaceData;Lsun/java2d/pipe/Region;Ljava/awt/Composite;III[I[IIZ)V
+  */
+ JNIEXPORT void JNICALL
+ Java_sun_java2d_windows_GDIRenderer_doDrawPoly
+@@ -412,7 +412,7 @@ Java_sun_java2d_windows_GDIRenderer_doDr
+ /*
+  * Class:     sun_java2d_windows_GDIRenderer
+  * Method:    doFillRect
+- * Signature: (Lsun/java2d/SurfaceData;Lsun/java2d/pipe/Region;Ljava/awt/Composite;IIIII)V
++ * Signature: (Lsun/java2d/windows/GDIWindowSurfaceData;Lsun/java2d/pipe/Region;Ljava/awt/Composite;IIIII)V
+  */
+ JNIEXPORT void JNICALL
+ Java_sun_java2d_windows_GDIRenderer_doFillRect
+@@ -445,7 +445,7 @@ Java_sun_java2d_windows_GDIRenderer_doFi
+ /*
+  * Class:     sun_java2d_windows_GDIRenderer
+  * Method:    doFillRoundRect
+- * Signature: (Lsun/java2d/SurfaceData;Lsun/java2d/pipe/Region;Ljava/awt/Composite;IIIIIII)V
++ * Signature: (Lsun/java2d/windows/GDIWindowSurfaceData;Lsun/java2d/pipe/Region;Ljava/awt/Composite;IIIIIII)V
+  */
+ JNIEXPORT void JNICALL
+ Java_sun_java2d_windows_GDIRenderer_doFillRoundRect
+@@ -488,7 +488,7 @@ Java_sun_java2d_windows_GDIRenderer_doFi
+ /*
+  * Class:     sun_java2d_windows_GDIRenderer
+  * Method:    doFillOval
+- * Signature: (Lsun/java2d/SurfaceData;Lsun/java2d/pipe/Region;Ljava/awt/Composite;IIIII)V
++ * Signature: (Lsun/java2d/windows/GDIWindowSurfaceData;Lsun/java2d/pipe/Region;Ljava/awt/Composite;IIIII)V
+  */
+ JNIEXPORT void JNICALL
+ Java_sun_java2d_windows_GDIRenderer_doFillOval
+@@ -555,7 +555,7 @@ Java_sun_java2d_windows_GDIRenderer_doFi
+ /*
+  * Class:     sun_java2d_windows_GDIRenderer
+  * Method:    doFillArc
+- * Signature: (Lsun/java2d/SurfaceData;Lsun/java2d/pipe/Region;Ljava/awt/Composite;IIIIIII)V
++ * Signature: (Lsun/java2d/windows/GDIWindowSurfaceData;Lsun/java2d/pipe/Region;Ljava/awt/Composite;IIIIIII)V
+  */
+ JNIEXPORT void JNICALL
+ Java_sun_java2d_windows_GDIRenderer_doFillArc
+@@ -615,7 +615,7 @@ Java_sun_java2d_windows_GDIRenderer_doFi
+ /*
+  * Class:     sun_java2d_windows_GDIRenderer
+  * Method:    doFillPoly
+- * Signature: (Lsun/java2d/SurfaceData;Lsun/java2d/pipe/Region;Ljava/awt/Composite;III[I[II)V
++ * Signature: (Lsun/java2d/windows/GDIWindowSurfaceData;Lsun/java2d/pipe/Region;Ljava/awt/Composite;III[I[II)V
+  */
+ JNIEXPORT void JNICALL
+ Java_sun_java2d_windows_GDIRenderer_doFillPoly
+@@ -680,7 +680,7 @@ Java_sun_java2d_windows_GDIRenderer_doFi
+ /*
+  * Class:     sun_java2d_windows_GDIRenderer
+  * Method:    doShape
+- * Signature:  (Lsun/java2d/SurfaceData;Lsun/java2d/pipe/Region;
++ * Signature:  (Lsun/java2d/windows/GDIWindowSurfaceData;Lsun/java2d/pipe/Region;
+  *              Ljava/awt/Composite;IIILjava/awt/geom/Path2D.Float;Z)V
+  */
+ JNIEXPORT void JNICALL
+@@ -863,7 +863,7 @@ INLINE BOOL RectInMonitorRect(RECT *rChe
+ /*
+  * Class:     sun_java2d_windows_GDIRenderer
+  * Method:    devCopyArea
+- * Signature: (Lsun/awt/windows/SurfaceData;IIIIII)V
++ * Signature: (Lsun/java2d/windows/GDIWindowSurfaceData;IIIIII)V
+  */
+ JNIEXPORT void JNICALL
+ Java_sun_java2d_windows_GDIRenderer_devCopyArea