From facdaae4e8e23f7b8d346ef0f35a814733ab2927 Mon Sep 17 00:00:00 2001
From: "Enrico Weigelt, metux IT consult" <info@metux.net>
Date: Fri, 17 May 2024 15:41:45 +0200
Subject: [PATCH] xace: typesafe hook function for XACE_KEY_AVAIL

he generic XaceHook() call isn't typesafe (und unnecessarily slow).
Better add an explicit function, just like we already have for others.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1556>
---
 Xext/xace.c   | 40 ++++------------------------------------
 Xext/xace.h   |  3 +--
 Xi/exevents.c |  2 +-
 3 files changed, 6 insertions(+), 39 deletions(-)

diff --git a/Xext/xace.c b/Xext/xace.c
index 0e05877d2bd..bb8ce69977e 100644
--- a/Xext/xace.c
+++ b/Xext/xace.c
@@ -136,43 +136,11 @@ int XaceHookAuthAvail(ClientPtr client, XID authId)
     return Success;
 }
 
-/* Entry point for hook functions.  Called by Xserver.
- */
-int
-XaceHook(int hook, ...)
+int XaceHookKeyAvail(xEventPtr ev, DeviceIntPtr dev, int count)
 {
-    union {
-        XaceKeyAvailRec key;
-    } u;
-    int *prv = NULL;            /* points to return value from callback */
-    va_list ap;                 /* argument list */
-
-    if (!XaceHooks[hook])
-        return Success;
-
-    va_start(ap, hook);
-
-    /* Marshal arguments for passing to callback.
-     * Each callback has its own case, which sets up a structure to hold
-     * the arguments and integer return parameter, or in some cases just
-     * sets calldata directly to a single argument (with no return result)
-     */
-    switch (hook) {
-    case XACE_KEY_AVAIL:
-        u.key.event = va_arg(ap, xEventPtr);
-        u.key.keybd = va_arg(ap, DeviceIntPtr);
-        u.key.count = va_arg(ap, int);
-
-        break;
-    default:
-        va_end(ap);
-        return 0;               /* unimplemented hook number */
-    }
-    va_end(ap);
-
-    /* call callbacks and return result, if any. */
-    CallCallbacks(&XaceHooks[hook], &u);
-    return prv ? *prv : Success;
+    XaceKeyAvailRec rec = { ev, dev, count };
+    CallCallbacks(&XaceHooks[XACE_KEY_AVAIL], &rec);
+    return Success;
 }
 
 /* XaceHookIsSet
diff --git a/Xext/xace.h b/Xext/xace.h
index c1e838ee105..481110a1cc3 100644
--- a/Xext/xace.h
+++ b/Xext/xace.h
@@ -94,6 +94,7 @@ int XaceHookServerAccess(ClientPtr client, Mask access_mode);
 int XaceHookScreenAccess(ClientPtr client, ScreenPtr screen, Mask access_mode);
 int XaceHookScreensaverAccess(ClientPtr client, ScreenPtr screen, Mask access_mode);
 int XaceHookAuthAvail(ClientPtr client, XID authId);
+int XaceHookKeyAvail(xEventPtr ev, DeviceIntPtr dev, int count);
 
 
 /* Register a callback for a given hook.
@@ -129,14 +130,12 @@ void XaceCensorImage(ClientPtr client,
 /* Define calls away when XACE is not being built. */
 
 #ifdef __GNUC__
-#define XaceHook(args...) Success
 #define XaceHookIsSet(args...) 0
 #define XaceHookDispatch(args...) Success
 #define XaceHookPropertyAccess(args...) Success
 #define XaceHookSelectionAccess(args...) Success
 #define XaceCensorImage(args...) { ; }
 #else
-#define XaceHook(...) Success
 #define XaceHookIsSet(...) 0
 #define XaceHookDispatch(...) Success
 #define XaceHookPropertyAccess(...) Success
diff --git a/Xi/exevents.c b/Xi/exevents.c
index dc70bae002b..6bfc9a6de3d 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1880,7 +1880,7 @@ ProcessDeviceEvent(InternalEvent *ev, DeviceIntPtr device)
         int count;
 
         if (EventToCore(ev, &core, &count) == Success && count > 0) {
-            XaceHook(XACE_KEY_AVAIL, core, device, 0);
+            XaceHookKeyAvail(core, device, 0);
             free(core);
         }
     }
-- 
GitLab