[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [freetype2-demos] ftbench-gsoc-goksu 2ecaa36 09/17: [graph] Correct function pointer types,
Werner Lemberg <=