freetype-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[freetype2] master 38272bf85: [ftstroke] Fix invalid pointer assignement


From: Werner Lemberg
Subject: [freetype2] master 38272bf85: [ftstroke] Fix invalid pointer assignement to `arc`
Date: Mon, 16 Dec 2024 14:57:58 -0500 (EST)

branch: master
commit 38272bf85341348eb0a5162ba4e1c95d370f9bce
Author: Ben Wagner <bungeman@gmail.com>
Commit: Ben Wagner <bungeman@gmail.com>

    [ftstroke] Fix invalid pointer assignement to `arc`
    
    In `FT_Stroker_ConicTo` and `FT_Stroker_CubicTo` there is a `bez_stack`.
    `arc` is initialized with `arc = bez_stack` and is never set to point
    into any different object. The main loop looks like `while ( arc >=
    bez_stack )` which is depending on a later `arc -= 2` (or `arc -= 3`) to
    make `arc` point to before `bez_stack`. However, using pointer
    subtraction to make `arc` point outside the array is undefined behavior,
    and attempting to use the value in the loop predicate is "very"
    undefined behavior. (C99 "Additive operators" 6.5.6.8.)
    
    This particular undefined behavior was discovered as either hangs or
    MemorySantizer issues after "[InstCombine] Infer nuw for gep inbounds
    from base of object" [0]. With this change, clang can infer that `arc`
    must always point into the `bez_stack` object and therefore cannot be at
    a "negative index" so the predicate is always true.
    
    [0] 
https://github.com/llvm/llvm-project/commit/e21ab4d16b555c28ded307571d138f594f33e325
    
    * src/base/ftstroke.c (FT_Stroker_ConicTo, FT_Stroker_CubicTo): test
    loop exit condition (there are no more arcs to process) before
    decrementing `arc`
    
    Fixes: #1307
---
 src/base/ftstroke.c | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/src/base/ftstroke.c b/src/base/ftstroke.c
index 64f46ce43..40d74d6e4 100644
--- a/src/base/ftstroke.c
+++ b/src/base/ftstroke.c
@@ -1371,7 +1371,7 @@
     arc[1] = *control;
     arc[2] = stroker->center;
 
-    while ( arc >= bez_stack )
+    do
     {
       FT_Angle  angle_in, angle_out;
 
@@ -1524,10 +1524,12 @@
         }
       }
 
-      arc -= 2;
-
       stroker->angle_in = angle_out;
-    }
+
+      if ( arc == bez_stack )
+        break;
+      arc -= 2;
+    } while ( 1 );
 
     stroker->center      = *to;
     stroker->line_length = 0;
@@ -1577,7 +1579,7 @@
     arc[2] = *control1;
     arc[3] = stroker->center;
 
-    while ( arc >= bez_stack )
+    do
     {
       FT_Angle  angle_in, angle_mid, angle_out;
 
@@ -1741,10 +1743,12 @@
         }
       }
 
-      arc -= 3;
-
       stroker->angle_in = angle_out;
-    }
+
+      if ( arc == bez_stack )
+        break;
+      arc -= 3;
+    } while ( 1 );
 
     stroker->center      = *to;
     stroker->line_length = 0;



reply via email to

[Prev in Thread] Current Thread [Next in Thread]