freetype-commit
[Top][All Lists]
Advanced

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

[freetype2] master 77f0814: Add macros for handling over-/underflowing `


From: Werner LEMBERG
Subject: [freetype2] master 77f0814: Add macros for handling over-/underflowing `FT_Int64' values.
Date: Thu, 23 Aug 2018 11:54:10 -0400 (EDT)

branch: master
commit 77f0814a3162a945d6d6704f545827f883e451e5
Author: Werner Lemberg <address@hidden>
Commit: Werner Lemberg <address@hidden>

    Add macros for handling     over-/underflowing `FT_Int64' values.
    
    * include/freetype/internal/ftcalc.h (ADD_INT64, SUB_INT64,
    MUL_INT64, DIV_INT64) [FT_LONG64]: New macros.
    
    * src/base/ftcalc.c (ft_corner_orientation) [FT_LONG64]: Use
    `SUB_INT64' and `MUL_INT64'.
    
    Reported as
    
      https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10028
---
 ChangeLog                          | 14 ++++++++++++++
 include/freetype/internal/ftcalc.h | 13 +++++++++++++
 src/base/ftcalc.c                  |  8 +++++---
 3 files changed, 32 insertions(+), 3 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 69cdc1d..585011a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2018-08-23  Werner Lemberg  <address@hidden>
+
+       Add macros for handling over-/underflowing `FT_Int64' values.
+
+       * include/freetype/internal/ftcalc.h (ADD_INT64, SUB_INT64,
+       MUL_INT64, DIV_INT64) [FT_LONG64]: New macros.
+
+       * src/base/ftcalc.c (ft_corner_orientation) [FT_LONG64]: Use
+       `SUB_INT64' and `MUL_INT64'.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10028
+
 2018-08-22  Werner Lemberg  <address@hidden>
 
        [truetype] Improve legibility of `glyf' parsing.
diff --git a/include/freetype/internal/ftcalc.h 
b/include/freetype/internal/ftcalc.h
index 733b674..dc1b664 100644
--- a/include/freetype/internal/ftcalc.h
+++ b/include/freetype/internal/ftcalc.h
@@ -489,6 +489,19 @@ FT_BEGIN_HEADER
 #define NEG_INT32( a )                                  \
           (FT_Int32)( (FT_UInt32)0 - (FT_UInt32)(a) )
 
+#ifdef FT_LONG64
+
+#define ADD_INT64( a, b )                               \
+          (FT_Int64)( (FT_UInt64)(a) + (FT_UInt64)(b) )
+#define SUB_INT64( a, b )                               \
+          (FT_Int64)( (FT_UInt64)(a) - (FT_UInt64)(b) )
+#define MUL_INT64( a, b )                               \
+          (FT_Int64)( (FT_UInt64)(a) * (FT_UInt64)(b) )
+#define NEG_INT64( a )                                  \
+          (FT_Int64)( (FT_UInt64)0 - (FT_UInt64)(a) )
+
+#endif /* FT_LONG64 */
+
 
 FT_END_HEADER
 
diff --git a/src/base/ftcalc.c b/src/base/ftcalc.c
index f110c9e..7a42103 100644
--- a/src/base/ftcalc.c
+++ b/src/base/ftcalc.c
@@ -983,9 +983,13 @@
                          FT_Pos  out_x,
                          FT_Pos  out_y )
   {
+    /* we silently ignore overflow errors since such large values */
+    /* lead to even more (harmless) rendering errors later on     */
+
 #ifdef FT_LONG64
 
-    FT_Int64  delta = (FT_Int64)in_x * out_y - (FT_Int64)in_y * out_x;
+    FT_Int64  delta = SUB_INT64( MUL_INT64( in_x, out_y ),
+                                 MUL_INT64( in_y, out_x ) );
 
 
     return ( delta > 0 ) - ( delta < 0 );
@@ -995,8 +999,6 @@
     FT_Int  result;
 
 
-    /* we silently ignore overflow errors, since such large values */
-    /* lead to even more (harmless) rendering errors later on      */
     if ( ADD_LONG( FT_ABS( in_x ), FT_ABS( out_y ) ) <= 131071L &&
          ADD_LONG( FT_ABS( in_y ), FT_ABS( out_x ) ) <= 131071L )
     {



reply via email to

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