From 591d95c79e31fd9d7805b801500e691988fcfaf4 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_AUTH_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     | 13 +++++++------
 Xext/xace.h     |  1 +
 os/connection.c |  2 +-
 3 files changed, 9 insertions(+), 7 deletions(-)

diff --git a/Xext/xace.c b/Xext/xace.c
index 02abc5696e6..0e05877d2bd 100644
--- a/Xext/xace.c
+++ b/Xext/xace.c
@@ -129,13 +129,19 @@ int XaceHookScreensaverAccess(ClientPtr client, ScreenPtr screen, Mask access_mo
     return rec.status;
 }
 
+int XaceHookAuthAvail(ClientPtr client, XID authId)
+{
+    XaceAuthAvailRec rec = { client, authId };
+    CallCallbacks(&XaceHooks[XACE_AUTH_AVAIL], &rec);
+    return Success;
+}
+
 /* Entry point for hook functions.  Called by Xserver.
  */
 int
 XaceHook(int hook, ...)
 {
     union {
-        XaceAuthAvailRec auth;
         XaceKeyAvailRec key;
     } u;
     int *prv = NULL;            /* points to return value from callback */
@@ -152,11 +158,6 @@ XaceHook(int hook, ...)
      * sets calldata directly to a single argument (with no return result)
      */
     switch (hook) {
-    case XACE_AUTH_AVAIL:
-        u.auth.client = va_arg(ap, ClientPtr);
-        u.auth.authId = va_arg(ap, XID);
-
-        break;
     case XACE_KEY_AVAIL:
         u.key.event = va_arg(ap, xEventPtr);
         u.key.keybd = va_arg(ap, DeviceIntPtr);
diff --git a/Xext/xace.h b/Xext/xace.h
index c2cbc3f202f..c1e838ee105 100644
--- a/Xext/xace.h
+++ b/Xext/xace.h
@@ -93,6 +93,7 @@ int XaceHookExtAccess(ClientPtr client, ExtensionEntry *ext);
 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);
 
 
 /* Register a callback for a given hook.
diff --git a/os/connection.c b/os/connection.c
index 9047d7fc763..425e692cfe2 100644
--- a/os/connection.c
+++ b/os/connection.c
@@ -579,7 +579,7 @@ ClientAuthorized(ClientPtr client,
     XdmcpOpenDisplay(priv->fd);
 #endif                          /* XDMCP */
 
-    XaceHook(XACE_AUTH_AVAIL, client, auth_id);
+    XaceHookAuthAvail(client, auth_id);
 
     /* At this point, if the client is authorized to change the access control
      * list, we should getpeername() information, and add the client to
-- 
GitLab