changeset 57786:b681239b7258

8235904: Infinite loop when rendering huge lines Reviewed-by: prr, kizune
author ceisserer
date Tue, 14 Jan 2020 15:19:49 -0800
parents abd50a05d1d1
children e72e86d5a090
files src/java.desktop/unix/classes/sun/java2d/xr/XRDrawLine.java test/jdk/java/awt/Graphics/DrawLineTest.java
diffstat 2 files changed, 78 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/java.desktop/unix/classes/sun/java2d/xr/XRDrawLine.java	Mon Jan 13 18:11:28 2020 +0000
+++ b/src/java.desktop/unix/classes/sun/java2d/xr/XRDrawLine.java	Tue Jan 14 15:19:49 2020 -0800
@@ -222,7 +222,7 @@
         outcode2 = outcode(x2, y2, cxmin, cymin, cxmax, cymax);
 
         while ((outcode1 | outcode2) != 0) {
-            int xsteps = 0, ysteps = 0;
+            long xsteps = 0, ysteps = 0;
 
             if ((outcode1 & outcode2) != 0) {
                 return false;
@@ -247,7 +247,7 @@
                     if (dx < 0) {
                         xsteps = -xsteps;
                     }
-                    x1 = ucX1 + xsteps;
+                    x1 = ucX1 + (int) xsteps;
                 } else if ((outcode1 & (OUTCODE_LEFT | OUTCODE_RIGHT)) != 0) {
                     if ((outcode1 & OUTCODE_LEFT) != 0) {
                         x1 = cxmin;
@@ -266,7 +266,7 @@
                     if (dy < 0) {
                         ysteps = -ysteps;
                     }
-                    y1 = ucY1 + ysteps;
+                    y1 = ucY1 + (int) ysteps;
                 }
                 outcode1 = outcode(x1, y1, cxmin, cymin, cxmax, cymax);
             } else {
@@ -290,7 +290,7 @@
                     if (dx > 0) {
                         xsteps = -xsteps;
                     }
-                    x2 = ucX2 + xsteps;
+                    x2 = ucX2 + (int) xsteps;
                 } else if ((outcode2 & (OUTCODE_LEFT | OUTCODE_RIGHT)) != 0) {
                     if ((outcode2 & OUTCODE_LEFT) != 0) {
                         x2 = cxmin;
@@ -311,7 +311,7 @@
                     if (dy > 0) {
                         ysteps = -ysteps;
                     }
-                    y2 = ucY2 + ysteps;
+                    y2 = ucY2 + (int) ysteps;
                 }
                 outcode2 = outcode(x2, y2, cxmin, cymin, cxmax, cymax);
             }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/java/awt/Graphics/DrawLineTest.java	Tue Jan 14 15:19:49 2020 -0800
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2020, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+  @test
+  @key headful
+  @bug 8235904
+  @run main/othervm/timeout=60 DrawLineTest
+*/
+
+import java.awt.EventQueue;
+import java.awt.Frame;
+import java.awt.Graphics;
+import java.awt.Image;
+
+public class DrawLineTest extends Frame {
+
+    volatile static boolean done = false;
+
+    public static void main(String[] args) throws Exception {
+
+        EventQueue.invokeLater(() -> {
+           DrawLineTest frame = new DrawLineTest();
+           frame.setVisible(true);
+           Image img = frame.createVolatileImage(1000, 1000);
+           img.getGraphics().drawLine(0, 0, 34005, 34005);
+           done = true;
+           frame.setVisible(false);
+           frame.dispose();
+           return;
+        });
+
+        int cnt=0;
+        while (!done && (cnt++ < 60)) {
+            try {
+               Thread.sleep(1000);
+            } catch (InterruptedException e) {
+            }
+        }
+
+        if (!done) {
+           // jtreg will shutdown the test properly
+           if ((System.getProperty("test.src") != null)) {
+               throw new RuntimeException("Test Failed");
+           } else {
+               // Not to be used in jtreg
+               System.out.println("Test failed.");
+               Runtime.getRuntime().halt(-1);
+           }
+        }
+        return;
+    }
+}