Commit bc7466ad45ea014f4b2ceb4a913f140b762a55c7

Werner Lemberg 2023-05-06T19:15:01

* src/bdf/bdfdrivr.c: Clean up interface. Ensure that all driver functions use the signature of the service or driver. This avoids pointer mismatches, which are technically undefined behaviour. Recent compilers are more picky in catching them as part of Control Flow Integrity tests.

diff --git a/src/bdf/bdfdrivr.c b/src/bdf/bdfdrivr.c
index d7e8e0e..e02a160 100644
--- a/src/bdf/bdfdrivr.c
+++ b/src/bdf/bdfdrivr.c
@@ -311,9 +311,9 @@ THE SOFTWARE.
 
 
   FT_CALLBACK_DEF( void )
-  BDF_Face_Done( FT_Face  bdfface )         /* BDF_Face */
+  BDF_Face_Done( FT_Face  face )         /* BDF_Face */
   {
-    BDF_Face   face = (BDF_Face)bdfface;
+    BDF_Face   bdfface = (BDF_Face)face;
     FT_Memory  memory;
 
 
@@ -322,31 +322,31 @@ THE SOFTWARE.
 
     memory = FT_FACE_MEMORY( face );
 
-    bdf_free_font( face->bdffont );
+    bdf_free_font( bdfface->bdffont );
 
-    FT_FREE( face->en_table );
+    FT_FREE( bdfface->en_table );
 
-    FT_FREE( face->charset_encoding );
-    FT_FREE( face->charset_registry );
-    FT_FREE( bdfface->family_name );
-    FT_FREE( bdfface->style_name );
+    FT_FREE( bdfface->charset_encoding );
+    FT_FREE( bdfface->charset_registry );
+    FT_FREE( face->family_name );
+    FT_FREE( face->style_name );
 
-    FT_FREE( bdfface->available_sizes );
+    FT_FREE( face->available_sizes );
 
-    FT_FREE( face->bdffont );
+    FT_FREE( bdfface->bdffont );
   }
 
 
   FT_CALLBACK_DEF( FT_Error )
   BDF_Face_Init( FT_Stream      stream,
-                 FT_Face        bdfface,        /* BDF_Face */
+                 FT_Face        face,        /* BDF_Face */
                  FT_Int         face_index,
                  FT_Int         num_params,
                  FT_Parameter*  params )
   {
-    FT_Error       error  = FT_Err_Ok;
-    BDF_Face       face   = (BDF_Face)bdfface;
-    FT_Memory      memory = FT_FACE_MEMORY( face );
+    FT_Error       error   = FT_Err_Ok;
+    BDF_Face       bdfface = (BDF_Face)face;
+    FT_Memory      memory  = FT_FACE_MEMORY( face );
 
     bdf_font_t*    font = NULL;
     bdf_options_t  options;
@@ -375,7 +375,7 @@ THE SOFTWARE.
       goto Exit;
 
     /* we have a bdf font: let's construct the face object */
-    face->bdffont = font;
+    bdfface->bdffont = font;
 
     /* BDF cannot have multiple faces in a single font file.
      * XXX: non-zero face_index is already invalid argument, but
@@ -386,7 +386,7 @@ THE SOFTWARE.
     if ( face_index > 0 && ( face_index & 0xFFFF ) > 0 )
     {
       FT_ERROR(( "BDF_Face_Init: invalid face index\n" ));
-      BDF_Face_Done( bdfface );
+      BDF_Face_Done( face );
       return FT_THROW( Invalid_Argument );
     }
 
@@ -401,18 +401,18 @@ THE SOFTWARE.
                   font->unencoded_size,
                   font->unencoded_used ));
 
-      bdfface->num_faces  = 1;
-      bdfface->face_index = 0;
+      face->num_faces  = 1;
+      face->face_index = 0;
 
-      bdfface->face_flags |= FT_FACE_FLAG_FIXED_SIZES |
-                             FT_FACE_FLAG_HORIZONTAL;
+      face->face_flags |= FT_FACE_FLAG_FIXED_SIZES |
+                          FT_FACE_FLAG_HORIZONTAL;
 
       prop = bdf_get_font_property( font, "SPACING" );
       if ( prop && prop->format == BDF_ATOM                             &&
            prop->value.atom                                             &&
            ( *(prop->value.atom) == 'M' || *(prop->value.atom) == 'm' ||
              *(prop->value.atom) == 'C' || *(prop->value.atom) == 'c' ) )
-        bdfface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
+        face->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
 
       /* FZ XXX: TO DO: FT_FACE_FLAGS_VERTICAL   */
       /* FZ XXX: I need a font to implement this */
@@ -420,26 +420,27 @@ THE SOFTWARE.
       prop = bdf_get_font_property( font, "FAMILY_NAME" );
       if ( prop && prop->value.atom )
       {
-        if ( FT_STRDUP( bdfface->family_name, prop->value.atom ) )
+        if ( FT_STRDUP( face->family_name, prop->value.atom ) )
           goto Exit;
       }
       else
-        bdfface->family_name = NULL;
+        face->family_name = NULL;
 
-      if ( FT_SET_ERROR( bdf_interpret_style( face ) ) )
+      if ( FT_SET_ERROR( bdf_interpret_style( bdfface ) ) )
         goto Exit;
 
       /* the number of glyphs (with one slot for the undefined glyph */
       /* at position 0 and all unencoded glyphs)                     */
-      bdfface->num_glyphs = (FT_Long)( font->glyphs_size + 1 );
+      face->num_glyphs = (FT_Long)( font->glyphs_size + 1 );
 
-      bdfface->num_fixed_sizes = 1;
-      if ( FT_NEW( bdfface->available_sizes ) )
+      face->num_fixed_sizes = 1;
+      if ( FT_NEW( face->available_sizes ) )
         goto Exit;
 
       {
-        FT_Bitmap_Size*  bsize = bdfface->available_sizes;
-        FT_Short         resolution_x = 0, resolution_y = 0;
+        FT_Bitmap_Size*  bsize        = face->available_sizes;
+        FT_Short         resolution_x = 0;
+        FT_Short         resolution_y = 0;
         long             value;
 
 
@@ -598,20 +599,20 @@ THE SOFTWARE.
         unsigned long  n;
 
 
-        if ( FT_QNEW_ARRAY( face->en_table, font->glyphs_size ) )
+        if ( FT_QNEW_ARRAY( bdfface->en_table, font->glyphs_size ) )
           goto Exit;
 
-        face->default_glyph = 0;
+        bdfface->default_glyph = 0;
         for ( n = 0; n < font->glyphs_size; n++ )
         {
-          (face->en_table[n]).enc = cur[n].encoding;
+          (bdfface->en_table[n]).enc = cur[n].encoding;
           FT_TRACE4(( "  idx %ld, val 0x%lX\n", n, cur[n].encoding ));
-          (face->en_table[n]).glyph = (FT_UShort)n;
+          (bdfface->en_table[n]).glyph = (FT_UShort)n;
 
           if ( cur[n].encoding == font->default_char )
           {
             if ( n < FT_UINT_MAX )
-              face->default_glyph = (FT_UInt)n;
+              bdfface->default_glyph = (FT_UInt)n;
             else
               FT_TRACE1(( "BDF_Face_Init:"
                           " idx %ld is too large for this system\n", n ));
@@ -639,27 +640,27 @@ THE SOFTWARE.
             const char*  s;
 
 
-            if ( FT_STRDUP( face->charset_encoding,
+            if ( FT_STRDUP( bdfface->charset_encoding,
                             charset_encoding->value.atom ) ||
-                 FT_STRDUP( face->charset_registry,
+                 FT_STRDUP( bdfface->charset_registry,
                             charset_registry->value.atom ) )
               goto Exit;
 
             /* Uh, oh, compare first letters manually to avoid dependency */
             /* on locales.                                                */
-            s = face->charset_registry;
+            s = bdfface->charset_registry;
             if ( ( s[0] == 'i' || s[0] == 'I' ) &&
                  ( s[1] == 's' || s[1] == 'S' ) &&
                  ( s[2] == 'o' || s[2] == 'O' ) )
             {
               s += 3;
-              if ( !ft_strcmp( s, "10646" )                      ||
-                   ( !ft_strcmp( s, "8859" ) &&
-                     !ft_strcmp( face->charset_encoding, "1" ) ) )
+              if ( !ft_strcmp( s, "10646" )                         ||
+                   ( !ft_strcmp( s, "8859" )                      &&
+                     !ft_strcmp( bdfface->charset_encoding, "1" ) ) )
                 unicode_charmap = 1;
               /* another name for ASCII */
-              else if ( !ft_strcmp( s, "646.1991" )                 &&
-                        !ft_strcmp( face->charset_encoding, "IRV" ) )
+              else if ( !ft_strcmp( s, "646.1991" )                    &&
+                        !ft_strcmp( bdfface->charset_encoding, "IRV" ) )
                 unicode_charmap = 1;
             }
 
@@ -667,7 +668,7 @@ THE SOFTWARE.
               FT_CharMapRec  charmap;
 
 
-              charmap.face        = FT_FACE( face );
+              charmap.face        = face;
               charmap.encoding    = FT_ENCODING_NONE;
               /* initial platform/encoding should indicate unset status? */
               charmap.platform_id = TT_PLATFORM_APPLE_UNICODE;
@@ -693,7 +694,7 @@ THE SOFTWARE.
           FT_CharMapRec  charmap;
 
 
-          charmap.face        = FT_FACE( face );
+          charmap.face        = face;
           charmap.encoding    = FT_ENCODING_ADOBE_STANDARD;
           charmap.platform_id = TT_PLATFORM_ADOBE;
           charmap.encoding_id = TT_ADOBE_ID_STANDARD;
@@ -701,8 +702,8 @@ THE SOFTWARE.
           error = FT_CMap_New( &bdf_cmap_class, NULL, &charmap, NULL );
 
           /* Select default charmap */
-          if ( bdfface->num_charmaps )
-            bdfface->charmap = bdfface->charmaps[0];
+          if ( face->num_charmaps )
+            face->charmap = face->charmaps[0];
         }
       }
     }
@@ -711,7 +712,7 @@ THE SOFTWARE.
     return error;
 
   Fail:
-    BDF_Face_Done( bdfface );
+    BDF_Face_Done( face );
     return FT_THROW( Unknown_File_Format );
   }
 
@@ -868,17 +869,18 @@ THE SOFTWARE.
   *
   */
 
-  static FT_Error
-  bdf_get_bdf_property( BDF_Face          face,
+  FT_CALLBACK_DEF( FT_Error )
+  bdf_get_bdf_property( FT_Face           face,       /* BDF_Face */
                         const char*       prop_name,
                         BDF_PropertyRec  *aproperty )
   {
+    BDF_Face         bdfface = (BDF_Face)face;
     bdf_property_t*  prop;
 
 
-    FT_ASSERT( face && face->bdffont );
+    FT_ASSERT( bdfface && bdfface->bdffont );
 
-    prop = bdf_get_font_property( face->bdffont, prop_name );
+    prop = bdf_get_font_property( bdfface->bdffont, prop_name );
     if ( prop )
     {
       switch ( prop->format )
@@ -921,13 +923,16 @@ THE SOFTWARE.
   }
 
 
-  static FT_Error
-  bdf_get_charset_id( BDF_Face      face,
+  FT_CALLBACK_DEF( FT_Error )
+  bdf_get_charset_id( FT_Face       face,               /* BDF_Face */
                       const char*  *acharset_encoding,
                       const char*  *acharset_registry )
   {
-    *acharset_encoding = face->charset_encoding;
-    *acharset_registry = face->charset_registry;
+    BDF_Face  bdfface = (BDF_Face)face;
+
+
+    *acharset_encoding = bdfface->charset_encoding;
+    *acharset_registry = bdfface->charset_registry;
 
     return 0;
   }
@@ -964,7 +969,6 @@ THE SOFTWARE.
   }
 
 
-
   FT_CALLBACK_TABLE_DEF
   const FT_Driver_ClassRec  bdf_driver_class =
   {