freetype-commit
[Top][All Lists]
Advanced

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

[freetype2-demos] ftbench-gsoc-goksu 2ecaa36 09/17: [graph] Correct func


From: Werner Lemberg
Subject: [freetype2-demos] ftbench-gsoc-goksu 2ecaa36 09/17: [graph] Correct function pointer types
Date: Sat, 20 May 2023 08:29:41 -0400 (EDT)

branch: ftbench-gsoc-goksu
commit 2ecaa369cfd68a1844695953fa73a2a7ef050f30
Author: Ben Wagner <bungeman@chromium.org>
Commit: Ben Wagner <bungeman@chromium.org>

    [graph] Correct function pointer types
    
    Building the demos with the CFI sanitizer detects a number of uses of
    undefined behavior in the Minimalist Graphics Subsystem where an
    indirect function call is made through a pointer of a different type.
    All of these cases worked in practice since the differing argument
    types were the same size and would have the same pointer value at
    runtime.
    
    Change the functions to take the correct types and downcast inside the
    function.
    
    * graph/beos/grbeos.cpp: remove casts
    
    * graph/mac/grmac.c: correct return type of `listen_event`, remove casts
    
    * graph/os2/gros2pm.c: correct function signatures, downcast inside
    functions, remove function pointer casts
    
    * graph/win32/grwin32.c: ditto
    
    * graph/x11/grx11.c: ditto
---
 graph/beos/grbeos.cpp |  2 +-
 graph/mac/grmac.c     | 21 ++++++-------
 graph/os2/gros2pm.c   | 49 ++++++++++++++++++-------------
 graph/win32/grwin32.c | 81 ++++++++++++++++++++++++++++++---------------------
 graph/x11/grx11.c     | 69 +++++++++++++++++++++++--------------------
 5 files changed, 126 insertions(+), 96 deletions(-)

diff --git a/graph/beos/grbeos.cpp b/graph/beos/grbeos.cpp
index 1018886..0fb14c4 100644
--- a/graph/beos/grbeos.cpp
+++ b/graph/beos/grbeos.cpp
@@ -167,7 +167,7 @@ grDevice  gr_beos_device =
   init_device,
   done_device,
 
-  (grDeviceInitSurfaceFunc) Window::init_surface,
+  Window::init_surface,
 
   0,
   0
diff --git a/graph/mac/grmac.c b/graph/mac/grmac.c
index 6cf9e08..25e50b7 100644
--- a/graph/mac/grmac.c
+++ b/graph/mac/grmac.c
@@ -154,9 +154,9 @@
   }
 
   static
-  void listen_event( grSurface*  surface,
-                     int         event_mask,
-                     grEvent*    grevent )
+  int listen_event( grSurface*  surface,
+                    int         event_mask,
+                    grEvent*    grevent )
   {
     grEvent  our_grevent;
     EventRecord mac_event;
@@ -200,7 +200,7 @@
               /* destroy the window here, since done_surface() doesn't get 
called */
               done_window();
             *grevent = our_grevent;
-            return;
+            return 1;
           case updateEvt:
             if ( theWindow && (WindowPtr)mac_event.message == theWindow )
             {
@@ -243,7 +243,7 @@
                     our_grevent.type = gr_event_key;
                     our_grevent.key = grKeyEsc;
                     *grevent = our_grevent;
-                    return;
+                    return 1;
                   }
                 }
                 else if (part == inContent)
@@ -265,6 +265,7 @@
           }
         }
     }
+    return 0;
   }
 
 
@@ -359,10 +360,10 @@ grSurface*  init_surface( grSurface*  surface,
   theWindow = NewCWindow(NULL, &bounds, "\p???", 1, 0, (WindowRef)-1, 1, 0);
 
   /* fill in surface interface */
-  surface->done         = (grDoneSurfaceFunc) done_surface;
-  surface->refresh_rect = (grRefreshRectFunc) refresh_rectangle;
-  surface->set_title    = (grSetTitleFunc)    set_title;
-  surface->listen_event = (grListenEventFunc) listen_event;
+  surface->done         = done_surface;
+  surface->refresh_rect = refresh_rectangle;
+  surface->set_title    = set_title;
+  surface->listen_event = listen_event;
 
   return surface;
 }
@@ -386,7 +387,7 @@ grSurface*  init_surface( grSurface*  surface,
     init_device,
     done_device,
 
-    (grDeviceInitSurfaceFunc) init_surface,
+    init_surface,
 
     0,
     0
diff --git a/graph/os2/gros2pm.c b/graph/os2/gros2pm.c
index 0efc3b2..ae67a89 100644
--- a/graph/os2/gros2pm.c
+++ b/graph/os2/gros2pm.c
@@ -170,8 +170,11 @@
 
   /* close a given window */
   static
-  void  done_surface( grPMSurface*  surface )
+  void  done_surface( grSurface*  baseSurface )
   {
+    grPMSurface*  surface = (grPMSurface*)baseSurface;
+
+
     LOG(( "Os2PM: done_surface(%08lx)\n", (long)surface ));
 
     if ( surface->frame_window )
@@ -260,12 +263,15 @@
 
 
   static
-  void  refresh_rectangle( grPMSurface* surface,
-                           int          x,
-                           int          y,
-                           int          w,
-                           int          h )
+  void  refresh_rectangle( grSurface* baseSurface,
+                           int        x,
+                           int        y,
+                           int        w,
+                           int        h )
   {
+    grPMSurface*  surface = (grPMSurface*)baseSurface;
+
+
     LOG(( "Os2PM: refresh_rectangle( %08lx, %d, %d, %d, %d )\n",
           (long)surface, x, y, w, h ));
 
@@ -291,10 +297,11 @@
 
 
   static
-  void  set_title( grPMSurface* surface,
+  void  set_title( grSurface*   baseSurface,
                    const char*  title )
   {
-    ULONG  rc;
+    grPMSurface*  surface = (grPMSurface*)baseSurface;
+    ULONG         rc;
 
 #if 1
     LOG(( "Os2PM: set_title( %08lx == %08lx, %s )\n",
@@ -311,11 +318,12 @@
 
 
   static
-  void  listen_event( grPMSurface* surface,
-                      int          event_mask,
-                      grEvent*     grevent )
+  int  listen_event( grSurface*  baseSurface,
+                     int         event_mask,
+                     grEvent*    grevent )
   {
-    ULONG  ulRequestCount;
+    grPMSurface*  surface = (grPMSurface*)baseSurface;
+    ULONG         ulRequestCount;
 
     (void) event_mask;   /* ignored for now */
 
@@ -325,14 +333,15 @@
     *grevent = surface->event;
     DosResetEventSem( surface->event_lock, &ulRequestCount );
 
-    return;
+    return 1;
   }
 
 
   static
-  grPMSurface*  init_surface( grPMSurface*  surface,
-                              grBitmap*     bitmap )
+  grPMSurface*  init_surface( grSurface*  baseSurface,
+                              grBitmap*   bitmap )
   {
+    grPMSurface*  surface = (grPMSurface*)baseSurface;
     PBITMAPINFO2  bit;
     SIZEL         sizl = { 0, 0 };
     LONG          palette[256];
@@ -474,10 +483,10 @@
     LOCK(surface->image_lock);
     UNLOCK(surface->image_lock);
 
-    surface->root.done         = (grDoneSurfaceFunc) done_surface;
-    surface->root.refresh_rect = (grRefreshRectFunc) refresh_rectangle;
-    surface->root.set_title    = (grSetTitleFunc)    set_title;
-    surface->root.listen_event = (grListenEventFunc) listen_event;
+    surface->root.done         = done_surface;
+    surface->root.refresh_rect = refresh_rectangle;
+    surface->root.set_title    = set_title;
+    surface->root.listen_event = listen_event;
 
     /* convert_rectangle( surface, 0, 0, bitmap->width, bitmap->rows ); */
     return surface;
@@ -743,7 +752,7 @@
     init_device,
     done_device,
 
-    (grDeviceInitSurfaceFunc) init_surface,
+    init_surface,
 
     0,
     0
diff --git a/graph/win32/grwin32.c b/graph/win32/grwin32.c
index a54dffe..5241d70 100644
--- a/graph/win32/grwin32.c
+++ b/graph/win32/grwin32.c
@@ -110,8 +110,11 @@
 
 /* destroys the surface*/
 static void
-gr_win32_surface_done( grWin32Surface*  surface )
+gr_win32_surface_done( grSurface*  baseSurface )
 {
+  grWin32Surface*  surface = (grWin32Surface*)baseSurface;
+
+
   /* The graphical window has perhaps already destroyed itself */
   if ( surface->window )
   {
@@ -134,15 +137,17 @@ gr_win32_surface_done( grWin32Surface*  surface )
 
 static void
 gr_win32_surface_refresh_rectangle(
-         grWin32Surface*  surface,
-         int              x,
-         int              y,
-         int              w,
-         int              h )
+         grSurface*  baseSurface,
+         int         x,
+         int         y,
+         int         w,
+         int         h )
 {
-  int        delta;
-  RECT       rect;
-  grBitmap*  bitmap = &surface->root.bitmap;
+  grWin32Surface*  surface = (grWin32Surface*)baseSurface;
+  int              delta;
+  RECT             rect;
+  grBitmap*        bitmap = &surface->root.bitmap;
+
 
   LOG(( "gr_win32_surface_refresh_rectangle: ( %p, %d, %d, %d, %d )\n",
         surface->root.bitmap.buffer, x, y, w, h ));
@@ -234,21 +239,25 @@ gr_win32_surface_refresh_rectangle(
 
 
 static void
-gr_win32_surface_set_title( grWin32Surface*  surface,
-                            const char*      title )
+gr_win32_surface_set_title( grSurface*   baseSurface,
+                            const char*  title )
 {
+  grWin32Surface*  surface = (grWin32Surface*)baseSurface;
+
+
   SetWindowText( surface->window, title );
 }
 
 
 static int
-gr_win32_surface_set_icon( grWin32Surface*  surface,
-                           grBitmap*        icon )
+gr_win32_surface_set_icon( grSurface*  baseSurface,
+                           grBitmap*   icon )
 {
-  int     s[] = { GetSystemMetrics( SM_CYSMICON ),
-                  GetSystemMetrics( SM_CYICON ) };
-  WPARAM  wParam;
-  HICON   hIcon;
+  grWin32Surface*  surface = (grWin32Surface*)baseSurface;
+  int              s[] = { GetSystemMetrics( SM_CYSMICON ),
+                           GetSystemMetrics( SM_CYICON ) };
+  WPARAM           wParam;
+  HICON            hIcon;
 
   if ( !icon )
     return s[1];
@@ -330,12 +339,13 @@ gr_win32_surface_resize( grWin32Surface*  surface,
   return 1;
 }
 
-static void
-gr_win32_surface_listen_event( grWin32Surface*  surface,
-                               int              event_mask,
-                               grEvent*         grevent )
+static int
+gr_win32_surface_listen_event( grSurface*  baseSurface,
+                               int         event_mask,
+                               grEvent*    grevent )
 {
-  MSG     msg;
+  grWin32Surface*  surface = (grWin32Surface*)baseSurface;
+  MSG              msg;
 
   event_mask=event_mask;  /* unused parameter */
 
@@ -359,7 +369,7 @@ gr_win32_surface_listen_event( grWin32Surface*  surface,
           grevent->type  = gr_event_resize;
           grevent->x     = width;
           grevent->y     = height;
-          return;
+          return 1;
         }
       }
       break;
@@ -373,11 +383,13 @@ gr_win32_surface_listen_event( grWin32Surface*  surface,
                                     ? "KeyPress: Char = '%c'\n"
                                     : "KeyPress: Char = <%02x>\n",
               msg.wParam ));
-        return;
+        return 1;
       }
       break;
     }
   }
+
+  return 0;
 }
 
 
@@ -427,10 +439,11 @@ DWORD WINAPI Window_ThreadProc( LPVOID lpParameter )
 
 
 static int
-gr_win32_surface_init( grWin32Surface*  surface,
-                       grBitmap*        bitmap )
+gr_win32_surface_init( grSurface*  baseSurface,
+                       grBitmap*   bitmap )
 {
-  MSG  msg;
+  grWin32Surface*  surface = (grWin32Surface*)baseSurface;
+  MSG              msg;
 
 
   /* Set default mode */
@@ -546,11 +559,11 @@ gr_win32_surface_init( grWin32Surface*  surface,
     goto Fail;
 
   /* wrap up */
-  surface->root.done         = (grDoneSurfaceFunc) gr_win32_surface_done;
-  surface->root.refresh_rect = (grRefreshRectFunc) 
gr_win32_surface_refresh_rectangle;
-  surface->root.set_title    = (grSetTitleFunc)    gr_win32_surface_set_title;
-  surface->root.set_icon     = (grSetIconFunc)     gr_win32_surface_set_icon;
-  surface->root.listen_event = (grListenEventFunc) 
gr_win32_surface_listen_event;
+  surface->root.done         = gr_win32_surface_done;
+  surface->root.refresh_rect = gr_win32_surface_refresh_rectangle;
+  surface->root.set_title    = gr_win32_surface_set_title;
+  surface->root.set_icon     = gr_win32_surface_set_icon;
+  surface->root.listen_event = gr_win32_surface_listen_event;
 
   LOG(( "Surface initialized: %dx%dx%d\n",
         surface->root.bitmap.width, surface->root.bitmap.rows,
@@ -559,7 +572,7 @@ gr_win32_surface_init( grWin32Surface*  surface,
   return 1;
 
 Fail:
-  gr_win32_surface_done( surface );
+  gr_win32_surface_done( &surface->root );
   return 0;
 }
 
@@ -696,7 +709,7 @@ LRESULT CALLBACK Message_Process( HWND handle, UINT mess,
     gr_win32_device_init,
     gr_win32_device_done,
 
-    (grDeviceInitSurfaceFunc) gr_win32_surface_init,
+    gr_win32_surface_init,
 
     0,
     0
diff --git a/graph/x11/grx11.c b/graph/x11/grx11.c
index c00d7bf..ca27492 100644
--- a/graph/x11/grx11.c
+++ b/graph/x11/grx11.c
@@ -965,9 +965,10 @@
 
   /* close a given window */
   static void
-  gr_x11_surface_done( grX11Surface*  surface )
+  gr_x11_surface_done( grSurface*  baseSurface )
   {
-    Display*  display = surface->display;
+    grX11Surface*  surface = (grX11Surface*)baseSurface;
+    Display*       display = surface->display;
 
 
     if ( display )
@@ -992,13 +993,14 @@
 
 
   static void
-  gr_x11_surface_refresh_rect( grX11Surface*  surface,
-                               int            x,
-                               int            y,
-                               int            w,
-                               int            h )
+  gr_x11_surface_refresh_rect( grSurface*  baseSurface,
+                               int         x,
+                               int         y,
+                               int         w,
+                               int         h )
   {
-    grX11Blitter  blit;
+    grX11Surface*  surface = (grX11Surface*)baseSurface;
+    grX11Blitter   blit;
 
 
     if ( surface->convert                    &&
@@ -1015,17 +1017,21 @@
 
 
   static void
-  gr_x11_surface_set_title( grX11Surface*  surface,
-                            const char*    title )
+  gr_x11_surface_set_title( grSurface*   baseSurface,
+                            const char*  title )
   {
+    grX11Surface*  surface = (grX11Surface*)baseSurface;
+
+
     XStoreName( surface->display, surface->win, title );
   }
 
 
   static int
-  gr_x11_surface_set_icon( grX11Surface*  surface,
-                           grBitmap*      icon )
+  gr_x11_surface_set_icon( grSurface*  baseSurface,
+                           grBitmap*   icon )
   {
+    grX11Surface*         surface = (grX11Surface*)baseSurface;
     const unsigned char*  s = (const unsigned char*)"\x80\x40\x20\x10";
     unsigned long*        buffer;
     unsigned long*        dst;
@@ -1151,17 +1157,18 @@
 
 
   static int
-  gr_x11_surface_listen_event( grX11Surface*  surface,
-                               int            event_mask,
-                               grEvent*       grevent )
+  gr_x11_surface_listen_event( grSurface*  baseSurface,
+                               int         event_mask,
+                               grEvent*    grevent )
   {
-    Display*      display = surface->display;
-    XEvent        x_event;
-    XExposeEvent  exposed;
-    KeySym        key;
+    grX11Surface*  surface = (grX11Surface*)baseSurface;
+    Display*       display = surface->display;
+    XEvent         x_event;
+    XExposeEvent   exposed;
+    KeySym         key;
 
-    int           num;
-    grKey         grkey;
+    int            num;
+    grKey          grkey;
 
     /* XXX: for now, ignore the event mask, and only exit when */
     /*      a key is pressed                                   */
@@ -1289,11 +1296,11 @@
 
 
   static int
-  gr_x11_surface_init( grX11Surface*  surface,
-                       grBitmap*      bitmap )
+  gr_x11_surface_init( grSurface*  baseSurface,
+                       grBitmap*   bitmap )
   {
-    Display*            display;
-
+    grX11Surface*  surface = (grX11Surface*)baseSurface;
+    Display*       display;
 
     surface->key_number = 0;
     surface->key_cursor = 0;
@@ -1447,11 +1454,11 @@
                        (unsigned char *)&pid, 1 );
     }
 
-    surface->root.done         = (grDoneSurfaceFunc)gr_x11_surface_done;
-    surface->root.refresh_rect = 
(grRefreshRectFunc)gr_x11_surface_refresh_rect;
-    surface->root.set_title    = (grSetTitleFunc)   gr_x11_surface_set_title;
-    surface->root.set_icon     = (grSetIconFunc)    gr_x11_surface_set_icon;
-    surface->root.listen_event = 
(grListenEventFunc)gr_x11_surface_listen_event;
+    surface->root.done         = gr_x11_surface_done;
+    surface->root.refresh_rect = gr_x11_surface_refresh_rect;
+    surface->root.set_title    = gr_x11_surface_set_title;
+    surface->root.set_icon     = gr_x11_surface_set_icon;
+    surface->root.listen_event = gr_x11_surface_listen_event;
 
     return 1;
   }
@@ -1465,7 +1472,7 @@
     gr_x11_device_init,
     gr_x11_device_done,
 
-    (grDeviceInitSurfaceFunc) gr_x11_surface_init,
+    gr_x11_surface_init,
 
     0,
     0



reply via email to

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