diff --git a/Xext/xace.c b/Xext/xace.c index c346b74e7340913472a3f80bba133da97d0610f8..82cc6d2b536bffda77a8cdacd7234cfe5d003d50 100644 --- a/Xext/xace.c +++ b/Xext/xace.c @@ -94,13 +94,19 @@ int XaceHookReceiveAccess(ClientPtr client, WindowPtr win, return rec.status; } +int XaceHookClientAccess(ClientPtr client, ClientPtr target, Mask access_mode) +{ + XaceClientAccessRec rec = { client, target, access_mode, Success }; + CallCallbacks(&XaceHooks[XACE_CLIENT_ACCESS], &rec); + return rec.status; +} + /* Entry point for hook functions. Called by Xserver. */ int XaceHook(int hook, ...) { union { - XaceClientAccessRec client; XaceExtAccessRec ext; XaceServerAccessRec server; XaceScreenAccessRec screen; @@ -121,14 +127,6 @@ XaceHook(int hook, ...) * sets calldata directly to a single argument (with no return result) */ switch (hook) { - case XACE_CLIENT_ACCESS: - u.client.client = va_arg(ap, ClientPtr); - u.client.target = va_arg(ap, ClientPtr); - u.client.access_mode = va_arg(ap, Mask); - - u.client.status = Success; /* default allow */ - prv = &u.client.status; - break; case XACE_EXT_ACCESS: u.ext.client = va_arg(ap, ClientPtr); diff --git a/Xext/xace.h b/Xext/xace.h index b55bc8d1ea4eb486651f6354f6fcc400b8999036..9227794a01d031e3a285eafd3bba1c1df19fb057 100644 --- a/Xext/xace.h +++ b/Xext/xace.h @@ -87,6 +87,8 @@ int XaceHookDeviceAccess(ClientPtr client, DeviceIntPtr dev, Mask access_mode); int XaceHookSendAccess(ClientPtr client, DeviceIntPtr dev, WindowPtr win, xEventPtr ev, int count); int XaceHookReceiveAccess(ClientPtr client, WindowPtr win, xEventPtr ev, int count); +int XaceHookClientAccess(ClientPtr client, ClientPtr target, Mask access_mode); + /* Register a callback for a given hook. */ diff --git a/dix/dispatch.c b/dix/dispatch.c index b3a759ee45d0ae2e1d6fcf6087ed0f15660ac557..4b339fc56dea0571423b1ee70b0093318da69999 100644 --- a/dix/dispatch.c +++ b/dix/dispatch.c @@ -3436,7 +3436,7 @@ ProcChangeCloseDownMode(ClientPtr client) REQUEST(xSetCloseDownModeReq); REQUEST_SIZE_MATCH(xSetCloseDownModeReq); - rc = XaceHook(XACE_CLIENT_ACCESS, client, client, DixManageAccess); + rc = XaceHookClientAccess(client, client, DixManageAccess); if (rc != Success) return rc; diff --git a/dix/dixutils.c b/dix/dixutils.c index 440b4d08cd89d1e7d1c2d44a5243970f85c7eb23..ac5c0f9628742d7b4842c0b6451809f9b412feb4 100644 --- a/dix/dixutils.c +++ b/dix/dixutils.c @@ -232,7 +232,7 @@ dixLookupClient(ClientPtr *pClient, XID rid, ClientPtr client, Mask access) if (rc != Success) goto bad; - rc = XaceHook(XACE_CLIENT_ACCESS, client, clients[clientIndex], access); + rc = XaceHookClientAccess(client, clients[clientIndex], access); if (rc != Success) goto bad;