freetype-commit
[Top][All Lists]
Advanced

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

[Git][freetype/freetype-demos][master] [graph] Correct function pointer


From: Ben Wagner (@bungeman)
Subject: [Git][freetype/freetype-demos][master] [graph] Correct function pointer types
Date: Fri, 12 May 2023 15:48:17 +0000

Ben Wagner pushed to branch master at FreeType / FreeType Demo Programs

Commits:

  • 2ecaa369
    by Ben Wagner at 2023-05-12T15:47:22+00:00
    [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
    

5 changed files:

Changes:

  • graph/beos/grbeos.cpp
    ... ... @@ -167,7 +167,7 @@ grDevice gr_beos_device =
    167 167
       init_device,
    
    168 168
       done_device,
    
    169 169
     
    
    170
    -  (grDeviceInitSurfaceFunc) Window::init_surface,
    
    170
    +  Window::init_surface,
    
    171 171
     
    
    172 172
       0,
    
    173 173
       0
    

  • graph/mac/grmac.c
    ... ... @@ -154,9 +154,9 @@
    154 154
       }
    
    155 155
     
    
    156 156
       static
    
    157
    -  void listen_event( grSurface*  surface,
    
    158
    -                     int         event_mask,
    
    159
    -                     grEvent*    grevent )
    
    157
    +  int listen_event( grSurface*  surface,
    
    158
    +                    int         event_mask,
    
    159
    +                    grEvent*    grevent )
    
    160 160
       {
    
    161 161
         grEvent  our_grevent;
    
    162 162
         EventRecord mac_event;
    
    ... ... @@ -200,7 +200,7 @@
    200 200
                   /* destroy the window here, since done_surface() doesn't get called */
    
    201 201
                   done_window();
    
    202 202
                 *grevent = our_grevent;
    
    203
    -            return;
    
    203
    +            return 1;
    
    204 204
               case updateEvt:
    
    205 205
                 if ( theWindow && (WindowPtr)mac_event.message == theWindow )
    
    206 206
                 {
    
    ... ... @@ -243,7 +243,7 @@
    243 243
                         our_grevent.type = gr_event_key;
    
    244 244
                         our_grevent.key = grKeyEsc;
    
    245 245
                         *grevent = our_grevent;
    
    246
    -                    return;
    
    246
    +                    return 1;
    
    247 247
                       }
    
    248 248
                     }
    
    249 249
                     else if (part == inContent)
    
    ... ... @@ -265,6 +265,7 @@
    265 265
               }
    
    266 266
             }
    
    267 267
         }
    
    268
    +    return 0;
    
    268 269
       }
    
    269 270
     
    
    270 271
     
    
    ... ... @@ -359,10 +360,10 @@ grSurface* init_surface( grSurface* surface,
    359 360
       theWindow = NewCWindow(NULL, &bounds, "\p???", 1, 0, (WindowRef)-1, 1, 0);
    
    360 361
     
    
    361 362
       /* fill in surface interface */
    
    362
    -  surface->done         = (grDoneSurfaceFunc) done_surface;
    
    363
    -  surface->refresh_rect = (grRefreshRectFunc) refresh_rectangle;
    
    364
    -  surface->set_title    = (grSetTitleFunc)    set_title;
    
    365
    -  surface->listen_event = (grListenEventFunc) listen_event;
    
    363
    +  surface->done         = done_surface;
    
    364
    +  surface->refresh_rect = refresh_rectangle;
    
    365
    +  surface->set_title    = set_title;
    
    366
    +  surface->listen_event = listen_event;
    
    366 367
     
    
    367 368
       return surface;
    
    368 369
     }
    
    ... ... @@ -386,7 +387,7 @@ grSurface* init_surface( grSurface* surface,
    386 387
         init_device,
    
    387 388
         done_device,
    
    388 389
     
    
    389
    -    (grDeviceInitSurfaceFunc) init_surface,
    
    390
    +    init_surface,
    
    390 391
     
    
    391 392
         0,
    
    392 393
         0
    

  • graph/os2/gros2pm.c
    ... ... @@ -170,8 +170,11 @@
    170 170
     
    
    171 171
       /* close a given window */
    
    172 172
       static
    
    173
    -  void  done_surface( grPMSurface*  surface )
    
    173
    +  void  done_surface( grSurface*  baseSurface )
    
    174 174
       {
    
    175
    +    grPMSurface*  surface = (grPMSurface*)baseSurface;
    
    176
    +
    
    177
    +
    
    175 178
         LOG(( "Os2PM: done_surface(%08lx)\n", (long)surface ));
    
    176 179
     
    
    177 180
         if ( surface->frame_window )
    
    ... ... @@ -260,12 +263,15 @@
    260 263
     
    
    261 264
     
    
    262 265
       static
    
    263
    -  void  refresh_rectangle( grPMSurface* surface,
    
    264
    -                           int          x,
    
    265
    -                           int          y,
    
    266
    -                           int          w,
    
    267
    -                           int          h )
    
    266
    +  void  refresh_rectangle( grSurface* baseSurface,
    
    267
    +                           int        x,
    
    268
    +                           int        y,
    
    269
    +                           int        w,
    
    270
    +                           int        h )
    
    268 271
       {
    
    272
    +    grPMSurface*  surface = (grPMSurface*)baseSurface;
    
    273
    +
    
    274
    +
    
    269 275
         LOG(( "Os2PM: refresh_rectangle( %08lx, %d, %d, %d, %d )\n",
    
    270 276
               (long)surface, x, y, w, h ));
    
    271 277
     
    
    ... ... @@ -291,10 +297,11 @@
    291 297
     
    
    292 298
     
    
    293 299
       static
    
    294
    -  void  set_title( grPMSurface* surface,
    
    300
    +  void  set_title( grSurface*   baseSurface,
    
    295 301
                        const char*  title )
    
    296 302
       {
    
    297
    -    ULONG  rc;
    
    303
    +    grPMSurface*  surface = (grPMSurface*)baseSurface;
    
    304
    +    ULONG         rc;
    
    298 305
     
    
    299 306
     #if 1
    
    300 307
         LOG(( "Os2PM: set_title( %08lx == %08lx, %s )\n",
    
    ... ... @@ -311,11 +318,12 @@
    311 318
     
    
    312 319
     
    
    313 320
       static
    
    314
    -  void  listen_event( grPMSurface* surface,
    
    315
    -                      int          event_mask,
    
    316
    -                      grEvent*     grevent )
    
    321
    +  int  listen_event( grSurface*  baseSurface,
    
    322
    +                     int         event_mask,
    
    323
    +                     grEvent*    grevent )
    
    317 324
       {
    
    318
    -    ULONG  ulRequestCount;
    
    325
    +    grPMSurface*  surface = (grPMSurface*)baseSurface;
    
    326
    +    ULONG         ulRequestCount;
    
    319 327
     
    
    320 328
         (void) event_mask;   /* ignored for now */
    
    321 329
     
    
    ... ... @@ -325,14 +333,15 @@
    325 333
         *grevent = surface->event;
    
    326 334
         DosResetEventSem( surface->event_lock, &ulRequestCount );
    
    327 335
     
    
    328
    -    return;
    
    336
    +    return 1;
    
    329 337
       }
    
    330 338
     
    
    331 339
     
    
    332 340
       static
    
    333
    -  grPMSurface*  init_surface( grPMSurface*  surface,
    
    334
    -                              grBitmap*     bitmap )
    
    341
    +  grPMSurface*  init_surface( grSurface*  baseSurface,
    
    342
    +                              grBitmap*   bitmap )
    
    335 343
       {
    
    344
    +    grPMSurface*  surface = (grPMSurface*)baseSurface;
    
    336 345
         PBITMAPINFO2  bit;
    
    337 346
         SIZEL         sizl = { 0, 0 };
    
    338 347
         LONG          palette[256];
    
    ... ... @@ -474,10 +483,10 @@
    474 483
         LOCK(surface->image_lock);
    
    475 484
         UNLOCK(surface->image_lock);
    
    476 485
     
    
    477
    -    surface->root.done         = (grDoneSurfaceFunc) done_surface;
    
    478
    -    surface->root.refresh_rect = (grRefreshRectFunc) refresh_rectangle;
    
    479
    -    surface->root.set_title    = (grSetTitleFunc)    set_title;
    
    480
    -    surface->root.listen_event = (grListenEventFunc) listen_event;
    
    486
    +    surface->root.done         = done_surface;
    
    487
    +    surface->root.refresh_rect = refresh_rectangle;
    
    488
    +    surface->root.set_title    = set_title;
    
    489
    +    surface->root.listen_event = listen_event;
    
    481 490
     
    
    482 491
         /* convert_rectangle( surface, 0, 0, bitmap->width, bitmap->rows ); */
    
    483 492
         return surface;
    
    ... ... @@ -743,7 +752,7 @@
    743 752
         init_device,
    
    744 753
         done_device,
    
    745 754
     
    
    746
    -    (grDeviceInitSurfaceFunc) init_surface,
    
    755
    +    init_surface,
    
    747 756
     
    
    748 757
         0,
    
    749 758
         0
    

  • graph/win32/grwin32.c
    ... ... @@ -110,8 +110,11 @@
    110 110
     
    
    111 111
     /* destroys the surface*/
    
    112 112
     static void
    
    113
    -gr_win32_surface_done( grWin32Surface*  surface )
    
    113
    +gr_win32_surface_done( grSurface*  baseSurface )
    
    114 114
     {
    
    115
    +  grWin32Surface*  surface = (grWin32Surface*)baseSurface;
    
    116
    +
    
    117
    +
    
    115 118
       /* The graphical window has perhaps already destroyed itself */
    
    116 119
       if ( surface->window )
    
    117 120
       {
    
    ... ... @@ -134,15 +137,17 @@ gr_win32_surface_done( grWin32Surface* surface )
    134 137
     
    
    135 138
     static void
    
    136 139
     gr_win32_surface_refresh_rectangle(
    
    137
    -         grWin32Surface*  surface,
    
    138
    -         int              x,
    
    139
    -         int              y,
    
    140
    -         int              w,
    
    141
    -         int              h )
    
    140
    +         grSurface*  baseSurface,
    
    141
    +         int         x,
    
    142
    +         int         y,
    
    143
    +         int         w,
    
    144
    +         int         h )
    
    142 145
     {
    
    143
    -  int        delta;
    
    144
    -  RECT       rect;
    
    145
    -  grBitmap*  bitmap = &surface->root.bitmap;
    
    146
    +  grWin32Surface*  surface = (grWin32Surface*)baseSurface;
    
    147
    +  int              delta;
    
    148
    +  RECT             rect;
    
    149
    +  grBitmap*        bitmap = &surface->root.bitmap;
    
    150
    +
    
    146 151
     
    
    147 152
       LOG(( "gr_win32_surface_refresh_rectangle: ( %p, %d, %d, %d, %d )\n",
    
    148 153
             surface->root.bitmap.buffer, x, y, w, h ));
    
    ... ... @@ -234,21 +239,25 @@ gr_win32_surface_refresh_rectangle(
    234 239
     
    
    235 240
     
    
    236 241
     static void
    
    237
    -gr_win32_surface_set_title( grWin32Surface*  surface,
    
    238
    -                            const char*      title )
    
    242
    +gr_win32_surface_set_title( grSurface*   baseSurface,
    
    243
    +                            const char*  title )
    
    239 244
     {
    
    245
    +  grWin32Surface*  surface = (grWin32Surface*)baseSurface;
    
    246
    +
    
    247
    +
    
    240 248
       SetWindowText( surface->window, title );
    
    241 249
     }
    
    242 250
     
    
    243 251
     
    
    244 252
     static int
    
    245
    -gr_win32_surface_set_icon( grWin32Surface*  surface,
    
    246
    -                           grBitmap*        icon )
    
    253
    +gr_win32_surface_set_icon( grSurface*  baseSurface,
    
    254
    +                           grBitmap*   icon )
    
    247 255
     {
    
    248
    -  int     s[] = { GetSystemMetrics( SM_CYSMICON ),
    
    249
    -                  GetSystemMetrics( SM_CYICON ) };
    
    250
    -  WPARAM  wParam;
    
    251
    -  HICON   hIcon;
    
    256
    +  grWin32Surface*  surface = (grWin32Surface*)baseSurface;
    
    257
    +  int              s[] = { GetSystemMetrics( SM_CYSMICON ),
    
    258
    +                           GetSystemMetrics( SM_CYICON ) };
    
    259
    +  WPARAM           wParam;
    
    260
    +  HICON            hIcon;
    
    252 261
     
    
    253 262
       if ( !icon )
    
    254 263
         return s[1];
    
    ... ... @@ -330,12 +339,13 @@ gr_win32_surface_resize( grWin32Surface* surface,
    330 339
       return 1;
    
    331 340
     }
    
    332 341
     
    
    333
    -static void
    
    334
    -gr_win32_surface_listen_event( grWin32Surface*  surface,
    
    335
    -                               int              event_mask,
    
    336
    -                               grEvent*         grevent )
    
    342
    +static int
    
    343
    +gr_win32_surface_listen_event( grSurface*  baseSurface,
    
    344
    +                               int         event_mask,
    
    345
    +                               grEvent*    grevent )
    
    337 346
     {
    
    338
    -  MSG     msg;
    
    347
    +  grWin32Surface*  surface = (grWin32Surface*)baseSurface;
    
    348
    +  MSG              msg;
    
    339 349
     
    
    340 350
       event_mask=event_mask;  /* unused parameter */
    
    341 351
     
    
    ... ... @@ -359,7 +369,7 @@ gr_win32_surface_listen_event( grWin32Surface* surface,
    359 369
               grevent->type  = gr_event_resize;
    
    360 370
               grevent->x     = width;
    
    361 371
               grevent->y     = height;
    
    362
    -          return;
    
    372
    +          return 1;
    
    363 373
             }
    
    364 374
           }
    
    365 375
           break;
    
    ... ... @@ -373,11 +383,13 @@ gr_win32_surface_listen_event( grWin32Surface* surface,
    373 383
                                         ? "KeyPress: Char = '%c'\n"
    
    374 384
                                         : "KeyPress: Char = <%02x>\n",
    
    375 385
                   msg.wParam ));
    
    376
    -        return;
    
    386
    +        return 1;
    
    377 387
           }
    
    378 388
           break;
    
    379 389
         }
    
    380 390
       }
    
    391
    +
    
    392
    +  return 0;
    
    381 393
     }
    
    382 394
     
    
    383 395
     
    
    ... ... @@ -427,10 +439,11 @@ DWORD WINAPI Window_ThreadProc( LPVOID lpParameter )
    427 439
     
    
    428 440
     
    
    429 441
     static int
    
    430
    -gr_win32_surface_init( grWin32Surface*  surface,
    
    431
    -                       grBitmap*        bitmap )
    
    442
    +gr_win32_surface_init( grSurface*  baseSurface,
    
    443
    +                       grBitmap*   bitmap )
    
    432 444
     {
    
    433
    -  MSG  msg;
    
    445
    +  grWin32Surface*  surface = (grWin32Surface*)baseSurface;
    
    446
    +  MSG              msg;
    
    434 447
     
    
    435 448
     
    
    436 449
       /* Set default mode */
    
    ... ... @@ -546,11 +559,11 @@ gr_win32_surface_init( grWin32Surface* surface,
    546 559
         goto Fail;
    
    547 560
     
    
    548 561
       /* wrap up */
    
    549
    -  surface->root.done         = (grDoneSurfaceFunc) gr_win32_surface_done;
    
    550
    -  surface->root.refresh_rect = (grRefreshRectFunc) gr_win32_surface_refresh_rectangle;
    
    551
    -  surface->root.set_title    = (grSetTitleFunc)    gr_win32_surface_set_title;
    
    552
    -  surface->root.set_icon     = (grSetIconFunc)     gr_win32_surface_set_icon;
    
    553
    -  surface->root.listen_event = (grListenEventFunc) gr_win32_surface_listen_event;
    
    562
    +  surface->root.done         = gr_win32_surface_done;
    
    563
    +  surface->root.refresh_rect = gr_win32_surface_refresh_rectangle;
    
    564
    +  surface->root.set_title    = gr_win32_surface_set_title;
    
    565
    +  surface->root.set_icon     = gr_win32_surface_set_icon;
    
    566
    +  surface->root.listen_event = gr_win32_surface_listen_event;
    
    554 567
     
    
    555 568
       LOG(( "Surface initialized: %dx%dx%d\n",
    
    556 569
             surface->root.bitmap.width, surface->root.bitmap.rows,
    
    ... ... @@ -559,7 +572,7 @@ gr_win32_surface_init( grWin32Surface* surface,
    559 572
       return 1;
    
    560 573
     
    
    561 574
     Fail:
    
    562
    -  gr_win32_surface_done( surface );
    
    575
    +  gr_win32_surface_done( &surface->root );
    
    563 576
       return 0;
    
    564 577
     }
    
    565 578
     
    
    ... ... @@ -696,7 +709,7 @@ LRESULT CALLBACK Message_Process( HWND handle, UINT mess,
    696 709
         gr_win32_device_init,
    
    697 710
         gr_win32_device_done,
    
    698 711
     
    
    699
    -    (grDeviceInitSurfaceFunc) gr_win32_surface_init,
    
    712
    +    gr_win32_surface_init,
    
    700 713
     
    
    701 714
         0,
    
    702 715
         0
    

  • graph/x11/grx11.c
    ... ... @@ -965,9 +965,10 @@
    965 965
     
    
    966 966
       /* close a given window */
    
    967 967
       static void
    
    968
    -  gr_x11_surface_done( grX11Surface*  surface )
    
    968
    +  gr_x11_surface_done( grSurface*  baseSurface )
    
    969 969
       {
    
    970
    -    Display*  display = surface->display;
    
    970
    +    grX11Surface*  surface = (grX11Surface*)baseSurface;
    
    971
    +    Display*       display = surface->display;
    
    971 972
     
    
    972 973
     
    
    973 974
         if ( display )
    
    ... ... @@ -992,13 +993,14 @@
    992 993
     
    
    993 994
     
    
    994 995
       static void
    
    995
    -  gr_x11_surface_refresh_rect( grX11Surface*  surface,
    
    996
    -                               int            x,
    
    997
    -                               int            y,
    
    998
    -                               int            w,
    
    999
    -                               int            h )
    
    996
    +  gr_x11_surface_refresh_rect( grSurface*  baseSurface,
    
    997
    +                               int         x,
    
    998
    +                               int         y,
    
    999
    +                               int         w,
    
    1000
    +                               int         h )
    
    1000 1001
       {
    
    1001
    -    grX11Blitter  blit;
    
    1002
    +    grX11Surface*  surface = (grX11Surface*)baseSurface;
    
    1003
    +    grX11Blitter   blit;
    
    1002 1004
     
    
    1003 1005
     
    
    1004 1006
         if ( surface->convert                    &&
    
    ... ... @@ -1015,17 +1017,21 @@
    1015 1017
     
    
    1016 1018
     
    
    1017 1019
       static void
    
    1018
    -  gr_x11_surface_set_title( grX11Surface*  surface,
    
    1019
    -                            const char*    title )
    
    1020
    +  gr_x11_surface_set_title( grSurface*   baseSurface,
    
    1021
    +                            const char*  title )
    
    1020 1022
       {
    
    1023
    +    grX11Surface*  surface = (grX11Surface*)baseSurface;
    
    1024
    +
    
    1025
    +
    
    1021 1026
         XStoreName( surface->display, surface->win, title );
    
    1022 1027
       }
    
    1023 1028
     
    
    1024 1029
     
    
    1025 1030
       static int
    
    1026
    -  gr_x11_surface_set_icon( grX11Surface*  surface,
    
    1027
    -                           grBitmap*      icon )
    
    1031
    +  gr_x11_surface_set_icon( grSurface*  baseSurface,
    
    1032
    +                           grBitmap*   icon )
    
    1028 1033
       {
    
    1034
    +    grX11Surface*         surface = (grX11Surface*)baseSurface;
    
    1029 1035
         const unsigned char*  s = (const unsigned char*)"\x80\x40\x20\x10";
    
    1030 1036
         unsigned long*        buffer;
    
    1031 1037
         unsigned long*        dst;
    
    ... ... @@ -1151,17 +1157,18 @@
    1151 1157
     
    
    1152 1158
     
    
    1153 1159
       static int
    
    1154
    -  gr_x11_surface_listen_event( grX11Surface*  surface,
    
    1155
    -                               int            event_mask,
    
    1156
    -                               grEvent*       grevent )
    
    1160
    +  gr_x11_surface_listen_event( grSurface*  baseSurface,
    
    1161
    +                               int         event_mask,
    
    1162
    +                               grEvent*    grevent )
    
    1157 1163
       {
    
    1158
    -    Display*      display = surface->display;
    
    1159
    -    XEvent        x_event;
    
    1160
    -    XExposeEvent  exposed;
    
    1161
    -    KeySym        key;
    
    1164
    +    grX11Surface*  surface = (grX11Surface*)baseSurface;
    
    1165
    +    Display*       display = surface->display;
    
    1166
    +    XEvent         x_event;
    
    1167
    +    XExposeEvent   exposed;
    
    1168
    +    KeySym         key;
    
    1162 1169
     
    
    1163
    -    int           num;
    
    1164
    -    grKey         grkey;
    
    1170
    +    int            num;
    
    1171
    +    grKey          grkey;
    
    1165 1172
     
    
    1166 1173
         /* XXX: for now, ignore the event mask, and only exit when */
    
    1167 1174
         /*      a key is pressed                                   */
    
    ... ... @@ -1289,11 +1296,11 @@
    1289 1296
     
    
    1290 1297
     
    
    1291 1298
       static int
    
    1292
    -  gr_x11_surface_init( grX11Surface*  surface,
    
    1293
    -                       grBitmap*      bitmap )
    
    1299
    +  gr_x11_surface_init( grSurface*  baseSurface,
    
    1300
    +                       grBitmap*   bitmap )
    
    1294 1301
       {
    
    1295
    -    Display*            display;
    
    1296
    -
    
    1302
    +    grX11Surface*  surface = (grX11Surface*)baseSurface;
    
    1303
    +    Display*       display;
    
    1297 1304
     
    
    1298 1305
         surface->key_number = 0;
    
    1299 1306
         surface->key_cursor = 0;
    
    ... ... @@ -1447,11 +1454,11 @@
    1447 1454
                            (unsigned char *)&pid, 1 );
    
    1448 1455
         }
    
    1449 1456
     
    
    1450
    -    surface->root.done         = (grDoneSurfaceFunc)gr_x11_surface_done;
    
    1451
    -    surface->root.refresh_rect = (grRefreshRectFunc)gr_x11_surface_refresh_rect;
    
    1452
    -    surface->root.set_title    = (grSetTitleFunc)   gr_x11_surface_set_title;
    
    1453
    -    surface->root.set_icon     = (grSetIconFunc)    gr_x11_surface_set_icon;
    
    1454
    -    surface->root.listen_event = (grListenEventFunc)gr_x11_surface_listen_event;
    
    1457
    +    surface->root.done         = gr_x11_surface_done;
    
    1458
    +    surface->root.refresh_rect = gr_x11_surface_refresh_rect;
    
    1459
    +    surface->root.set_title    = gr_x11_surface_set_title;
    
    1460
    +    surface->root.set_icon     = gr_x11_surface_set_icon;
    
    1461
    +    surface->root.listen_event = gr_x11_surface_listen_event;
    
    1455 1462
     
    
    1456 1463
         return 1;
    
    1457 1464
       }
    
    ... ... @@ -1465,7 +1472,7 @@
    1465 1472
         gr_x11_device_init,
    
    1466 1473
         gr_x11_device_done,
    
    1467 1474
     
    
    1468
    -    (grDeviceInitSurfaceFunc) gr_x11_surface_init,
    
    1475
    +    gr_x11_surface_init,
    
    1469 1476
     
    
    1470 1477
         0,
    
    1471 1478
         0
    


  • reply via email to

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