shithub: freetype+ttf2subf

Download patch

ref: 1d565fb01bfe2cc02955b675230a600bb8bb1b56
parent: a33bd861d7866579953c990949831d8353c15a8e
author: Werner Lemberg <[email protected]>
date: Sun Feb 13 16:42:42 EST 2005

* src/type1/t1load.c (read_binary_data): Return more meaningful
value.
(parse_encoding, parse_subrs, parse_charstrings, parse_dict): Check
parser error value after call to T1_Skip_PS_Token (where necessary).

* src/type1/t1parse.c (T1_Get_Private_Dict): Check parser error
value after call to T1_Skip_PS_Token.

* src/cid/cidparse.c (cid_parser_new): Check parser error value
after call to cid_parser_skip_PS_token.

* src/type42/t42parse.c (t42_parse_encoding, t42_parse_sfnts,
t42_parse_charstrings, t42_parse_dict): Check parser error value
after call to T1_Skip_PS_Token (where necessary).

* src/psaux/psobjc.c (skip_string, ps_parser_skip_PS_token,
ps_tobytes): Add error messages.

git/fs: mount .git/fs: mount/attach disallowed
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+2005-02-13  Werner Lemberg  <[email protected]>
+
+	* src/type1/t1load.c (read_binary_data): Return more meaningful
+	value.
+	(parse_encoding, parse_subrs, parse_charstrings, parse_dict): Check
+	parser error value after call to T1_Skip_PS_Token (where necessary).
+
+	* src/type1/t1parse.c (T1_Get_Private_Dict): Check parser error
+	value after call to T1_Skip_PS_Token.
+
+	* src/cid/cidparse.c (cid_parser_new): Check parser error value
+	after call to cid_parser_skip_PS_token.
+
+	* src/type42/t42parse.c (t42_parse_encoding, t42_parse_sfnts,
+	t42_parse_charstrings, t42_parse_dict): Check parser error value
+	after call to T1_Skip_PS_Token (where necessary).
+
+	* src/psaux/psobjc.c (skip_string, ps_parser_skip_PS_token,
+	ps_tobytes): Add error messages.
+
 2005-02-12  Werner Lemberg  <[email protected]>
 
 	* configure: Output more variables to the created Makefile so that
--- a/src/cid/cidparse.c
+++ b/src/cid/cidparse.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CID-keyed Type1 parser (body).                                       */
 /*                                                                         */
-/*  Copyright 1996-2001, 2002, 2003, 2004 by                               */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2005 by                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -152,6 +152,9 @@
 
     while ( cur < limit )
     {
+      if ( parser->root.error )
+        break;
+
       if ( *cur == 'S' && ft_strncmp( (char*)cur, "StartData", 9 ) == 0 )
       {
         if ( ft_strncmp( (char*)arg1, "(Hex)", 5 ) == 0 )
--- a/src/psaux/psobjs.c
+++ b/src/psaux/psobjs.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auxiliary functions for PostScript fonts (body).                     */
 /*                                                                         */
-/*  Copyright 1996-2001, 2002, 2003, 2004 by                               */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2005 by                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -429,7 +429,10 @@
     }
 
     if ( cur < limit && *cur != '>' )
+    {
+      FT_ERROR(( "skip_string: missing closing delimiter `>'\n" ));
       parser->error = PSaux_Err_Invalid_File_Format;
+    }
     else
       cur++;
 
@@ -492,6 +495,8 @@
       cur++;
       if ( cur >= limit || *cur != '>' )             /* >> */
       {
+        FT_ERROR(( "ps_parser_skip_PS_token: "
+                   "unexpected closing delimiter `>'\n" ));
         parser->error = PSaux_Err_Invalid_File_Format;
         goto Exit;
       }
@@ -516,6 +521,8 @@
 
       if ( *cur == ')' )
       {
+        FT_ERROR(( "ps_parser_skip_PS_token: "
+                   "unexpected closing delimiter `)'\n" ));
         parser->error = PSaux_Err_Invalid_File_Format;
         goto Exit;
       }
@@ -795,6 +802,7 @@
     {
       if ( *cur != '<' )
       {
+        FT_ERROR(( "ps_tobytes: Missing starting delimiter `<'\n" ));
         error = PSaux_Err_Invalid_File_Format;
         goto Exit;
       }
@@ -834,6 +842,7 @@
     {
       if ( cur < limit && *cur != '>' )
       {
+        FT_ERROR(( "ps_tobytes: Missing closing delimiter `>'\n" ));
         error = PSaux_Err_Invalid_File_Format;
         goto Exit;
       }
--- a/src/type1/t1load.c
+++ b/src/type1/t1load.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 font loader (body).                                           */
 /*                                                                         */
-/*  Copyright 1996-2001, 2002, 2003, 2004 by                               */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2005 by                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -1008,7 +1008,7 @@
       *base = parser->root.cursor + 1;
 
       parser->root.cursor += *size + 1;
-      return 1;
+      return !parser->root.error;
     }
 
     FT_ERROR(( "read_binary_data: invalid size field\n" ));
@@ -1202,6 +1202,8 @@
 
             parser->root.cursor = cur;
             T1_Skip_PS_Token( parser );
+            if ( parser->root.error )
+              return;
 
             len = parser->root.cursor - cur;
 
@@ -1277,7 +1279,9 @@
 
     /* position the parser right before the `dup' of the first subr */
     T1_Skip_PS_Token( parser );         /* `array' */
-    T1_Skip_Spaces  ( parser );
+    if ( parser->root.error )
+      return;
+    T1_Skip_Spaces( parser );
 
     /* initialize subrs array -- with synthetic fonts it is possible */
     /* we get here twice                                             */
@@ -1315,6 +1319,8 @@
       /* `noaccess' & `put'.  We position the parser right     */
       /* before the next `dup', if any.                        */
       T1_Skip_PS_Token( parser );   /* `NP' or `|' or `noaccess' */
+      if ( parser->root.error )
+        return;
       T1_Skip_Spaces  ( parser );
 
       if ( ft_strncmp( (char*)parser->root.cursor, "put", 3 ) == 0 )
@@ -1451,6 +1457,8 @@
       }
 
       T1_Skip_PS_Token( parser );
+      if ( parser->root.error )
+        return;
 
       if ( *cur == '/' )
       {
@@ -1723,7 +1731,9 @@
             break;
 
           T1_Skip_PS_Token( parser );
-          T1_Skip_Spaces  ( parser );
+          if ( parser->root.error )
+            goto Exit;
+          T1_Skip_Spaces( parser );
           cur = parser->root.cursor;
         }
 
@@ -1759,6 +1769,8 @@
       {
         start_binary = cur;
         T1_Skip_PS_Token( parser );
+        if ( parser->root.error )
+          goto Exit;
         have_integer = 1;
       }
 
@@ -1801,6 +1813,8 @@
 
         parser->root.cursor = cur;
         T1_Skip_PS_Token( parser );
+        if ( parser->root.error )
+          goto Exit;
 
         len = parser->root.cursor - cur;
 
--- a/src/type1/t1parse.c
+++ b/src/type1/t1parse.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 parser (body).                                                */
 /*                                                                         */
-/*  Copyright 1996-2001, 2002, 2003, 2004 by                               */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2005 by                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -337,6 +337,8 @@
           goto Found;
 
         T1_Skip_PS_Token( parser );
+        if ( parser->root.error )
+          break;
         T1_Skip_Spaces  ( parser );
         cur = parser->root.cursor;
       }
--- a/src/type42/t42parse.c
+++ b/src/type42/t42parse.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 42 font parser (body).                                          */
 /*                                                                         */
-/*  Copyright 2002, 2003, 2004 by Roberto Alameda.                         */
+/*  Copyright 2002, 2003, 2004, 2005 by Roberto Alameda.                   */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
 /*  modified, and distributed under the terms of the FreeType project      */
@@ -412,14 +412,16 @@
 
             parser->root.cursor = cur;
             T1_Skip_PS_Token( parser );
+            if ( parser->root.error )
+              return;
 
             len = parser->root.cursor - cur;
 
             parser->root.error = T1_Add_Table( char_table, charcode,
                                                cur, len + 1 );
-            char_table->elements[charcode][len] = '\0';
             if ( parser->root.error )
               return;
+            char_table->elements[charcode][len] = '\0';
 
             n++;
           }
@@ -550,6 +552,8 @@
         string_size = T1_ToInt( parser );
 
         T1_Skip_PS_Token( parser );             /* `RD' */
+        if ( parser->root.error )
+          return;
 
         string_buf = parser->root.cursor + 1;   /* one space after `RD' */
 
@@ -691,6 +695,8 @@
 
 
       T1_Skip_PS_Token( parser );
+      if ( parser->root.error )
+        return;
       T1_Skip_Spaces( parser );
       cur = parser->root.cursor;
 
@@ -705,6 +711,8 @@
           break;
         }
         T1_Skip_PS_Token( parser );
+        if ( parser->root.error )
+          return;
         T1_Skip_Spaces( parser );
       }
     }
@@ -767,6 +775,8 @@
         break;
 
       T1_Skip_PS_Token( parser );
+      if ( parser->root.error )
+        return;
 
       if ( *cur == '/' )
       {
@@ -1003,6 +1013,8 @@
             break;
 
           T1_Skip_PS_Token( parser );
+          if ( parser->root.error )
+            goto Exit;
           T1_Skip_Spaces  ( parser );
           cur = parser->root.cursor;
         }
@@ -1033,6 +1045,8 @@
 
         parser->root.cursor = cur;
         T1_Skip_PS_Token( parser );
+        if ( parser->root.error )
+          goto Exit;
 
         len = parser->root.cursor - cur;
 
@@ -1069,11 +1083,16 @@
         }
       }
       else
+      {
         T1_Skip_PS_Token( parser );
+        if ( parser->root.error )
+          goto Exit;
+      }
 
       T1_Skip_Spaces( parser );
     }
 
+  Exit:
     return parser->root.error;
   }