Piotr Caban : d2d1: Avoid possible infinite loop in d2d_geometry_intersect_self caused by rounding errors.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Aug 27 08:25:36 CDT 2015


Module: wine
Branch: master
Commit: f5b64c0d35640b574db057486708debd431745c2
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=f5b64c0d35640b574db057486708debd431745c2

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Thu Aug 27 12:43:13 2015 +0200

d2d1: Avoid possible infinite loop in d2d_geometry_intersect_self caused by rounding errors.

---

 dlls/d2d1/geometry.c | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/dlls/d2d1/geometry.c b/dlls/d2d1/geometry.c
index 41af05a..a705723 100644
--- a/dlls/d2d1/geometry.c
+++ b/dlls/d2d1/geometry.c
@@ -843,23 +843,25 @@ static BOOL d2d_geometry_intersect_self(struct d2d_geometry *geometry)
 {
     D2D1_POINT_2F p0, p1, q0, q1, v_p, v_q, v_qp, intersection;
     struct d2d_figure *figure_p, *figure_q;
-    size_t i, j, k, l, limit;
+    size_t i, j, k, l, min_j, min_l, max_l;
     float s, t, det;
 
     for (i = 0; i < geometry->u.path.figure_count; ++i)
     {
         figure_p = &geometry->u.path.figures[i];
         p0 = figure_p->vertices[figure_p->vertex_count - 1];
+        min_j = 0;
+        min_l = 0;
         for (k = 0; k < figure_p->vertex_count; p0 = p1, ++k)
         {
             p1 = figure_p->vertices[k];
             d2d_point_subtract(&v_p, &p1, &p0);
-            for (j = 0; j < i || (j == i && k); ++j)
+            for (j = min_j, min_j = 0, l = min_l, min_l = 0; j < i || (j == i && k); ++j, l = 0)
             {
                 figure_q = &geometry->u.path.figures[j];
-                limit = j == i ? k - 1 : figure_q->vertex_count;
-                q0 = figure_q->vertices[figure_q->vertex_count - 1];
-                for (l = 0; l < limit; q0 = q1, ++l)
+                max_l = j == i ? k - 1 : figure_q->vertex_count;
+                q0 = figure_q->vertices[l == 0 ? figure_q->vertex_count - 1 : l - 1];
+                for (; l < max_l; q0 = q1, ++l)
                 {
                     q1 = figure_q->vertices[l];
                     d2d_point_subtract(&v_q, &q1, &q0);
@@ -884,7 +886,7 @@ static BOOL d2d_geometry_intersect_self(struct d2d_geometry *geometry)
                             return FALSE;
                         if (j == i)
                             ++k;
-                        ++limit;
+                        ++max_l;
                         ++l;
                     }
 
@@ -892,6 +894,8 @@ static BOOL d2d_geometry_intersect_self(struct d2d_geometry *geometry)
                     {
                         if (!d2d_figure_insert_vertex(figure_p, k, intersection))
                             return FALSE;
+                        min_j = j;
+                        min_l = l+1;
                         p1 = intersection;
                         d2d_point_subtract(&v_p, &p1, &p0);
                     }




More information about the wine-cvs mailing list