shithub: freetype+ttf2subf

Download patch

ref: 35bb214ae620400cd09a2cfaf3bacd66e179a1f6
parent: ba67957d5ead443f4b6b31805d6e780d54361ca4
author: Werner Lemberg <[email protected]>
date: Sat Mar 3 07:29:53 EST 2012

[cff] One more check against malformed font matrix.

* src/cff/cffparse.c (cff_parse_font_matrix): Guard against `xx' and
`yy' matrix coefficients being zero.

git/fs: mount .git/fs: mount/attach disallowed
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2012-03-03  Werner Lemberg  <[email protected]>
 
+	[cff] One more check against malformed font matrix.
+
+	* src/cff/cffparse.c (cff_parse_font_matrix): Guard against `xx' and
+	`yy' matrix coefficients being zero.
+
+2012-03-03  Werner Lemberg  <[email protected]>
+
 	Fix Savannah bug #35660.
 
 	For some divisions, we use casts to 32bit entities.  Always guard
--- a/src/cff/cffparse.c
+++ b/src/cff/cffparse.c
@@ -474,22 +474,11 @@
 
       if ( scaling < 0 || scaling > 9 )
       {
-        /* Return default matrix in case of unlikely values. */
-
         FT_TRACE1(( "cff_parse_font_matrix:"
                     " strange scaling value for xx element (%d),\n"
                     "                      "
                     " using default matrix\n", scaling ));
-
-        matrix->xx = 0x10000L;
-        matrix->yx = 0;
-        matrix->xy = 0;
-        matrix->yy = 0x10000L;
-        offset->x  = 0;
-        offset->y  = 0;
-        *upm       = 1;
-
-        goto Exit;
+        goto Default_matrix;
       }
 
       matrix->yx = cff_parse_fixed_scaled( data++, scaling );
@@ -498,6 +487,13 @@
       offset->x  = cff_parse_fixed_scaled( data++, scaling );
       offset->y  = cff_parse_fixed_scaled( data,   scaling );
 
+      if ( matrix->xx == 0 || matrix->yy == 0 )
+      {
+        FT_TRACE1(( "cff_parse_font_matrix:"
+                    " xx or yy element is zero, using default matrix\n" ));
+        goto Default_matrix;
+      }
+
       *upm = power_tens[scaling];
 
       FT_TRACE4(( " [%f %f %f %f %f %f]\n",
@@ -508,6 +504,17 @@
                   (double)offset->x  / *upm / 65536,
                   (double)offset->y  / *upm / 65536 ));
     }
+
+    goto Exit;
+
+  Default_matrix:
+    matrix->xx = 0x10000L;
+    matrix->yx = 0;
+    matrix->xy = 0;
+    matrix->yy = 0x10000L;
+    offset->x  = 0;
+    offset->y  = 0;
+    *upm       = 1;
 
   Exit:
     return error;