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