xace: typesafe hook function for XACE_DEVICE_ACCESS

The 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>
(cherry picked from commit 9524ffee89)
This commit is contained in:
Enrico Weigelt, metux IT consult 2024-05-16 20:15:56 +02:00 committed by Alan Coopersmith
parent bd324c0c2a
commit e4465f2cdb
12 changed files with 57 additions and 67 deletions

View file

@ -72,13 +72,19 @@ int XaceHookResourceAccess(ClientPtr client, XID id, RESTYPE rtype, void *res,
return rec.status;
}
int XaceHookDeviceAccess(ClientPtr client, DeviceIntPtr dev, Mask access_mode)
{
XaceDeviceAccessRec rec = { client, dev, access_mode, Success };
CallCallbacks(&XaceHooks[XACE_DEVICE_ACCESS], &rec);
return rec.status;
}
/* Entry point for hook functions. Called by Xserver.
*/
int
XaceHook(int hook, ...)
{
union {
XaceDeviceAccessRec dev;
XaceSendAccessRec send;
XaceReceiveAccessRec recv;
XaceClientAccessRec client;
@ -102,14 +108,6 @@ XaceHook(int hook, ...)
* sets calldata directly to a single argument (with no return result)
*/
switch (hook) {
case XACE_DEVICE_ACCESS:
u.dev.client = va_arg(ap, ClientPtr);
u.dev.dev = va_arg(ap, DeviceIntPtr);
u.dev.access_mode = va_arg(ap, Mask);
u.dev.status = Success; /* default allow */
prv = &u.dev.status;
break;
case XACE_SEND_ACCESS:
u.send.client = va_arg(ap, ClientPtr);
u.send.dev = va_arg(ap, DeviceIntPtr);

View file

@ -84,6 +84,8 @@ extern _X_EXPORT int XaceHookSelectionAccess(ClientPtr ptr, Selection ** ppSel,
_X_EXPORT int XaceHookResourceAccess(ClientPtr client, XID id, RESTYPE rtype, void *res,
RESTYPE ptype, void *parent, Mask access_mode);
int XaceHookDeviceAccess(ClientPtr client, DeviceIntPtr dev, Mask access_mode);
/* Register a callback for a given hook.
*/
#define XaceRegisterCallback(hook,callback,data) \

View file

@ -2512,7 +2512,7 @@ GrabButton(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
if (param->this_device_mode == GrabModeSync ||
param->other_devices_mode == GrabModeSync)
access_mode |= DixFreezeAccess;
rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, access_mode);
rc = XaceHookDeviceAccess(client, dev, access_mode);
if (rc != Success)
return rc;
rc = dixLookupWindow(&pWin, param->grabWindow, client, DixSetAttrAccess);
@ -2568,7 +2568,7 @@ GrabKey(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
if (param->this_device_mode == GrabModeSync ||
param->other_devices_mode == GrabModeSync)
access_mode |= DixFreezeAccess;
rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, access_mode);
rc = XaceHookDeviceAccess(client, dev, access_mode);
if (rc != Success)
return rc;
@ -2611,7 +2611,7 @@ GrabWindow(ClientPtr client, DeviceIntPtr dev, int type,
if (param->this_device_mode == GrabModeSync ||
param->other_devices_mode == GrabModeSync)
access_mode |= DixFreezeAccess;
rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, access_mode);
rc = XaceHookDeviceAccess(client, dev, access_mode);
if (rc != Success)
return rc;
@ -2642,7 +2642,7 @@ GrabTouchOrGesture(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr mod_dev,
rc = dixLookupWindow(&pWin, param->grabWindow, client, DixSetAttrAccess);
if (rc != Success)
return rc;
rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixGrabAccess);
rc = XaceHookDeviceAccess(client, dev, DixGrabAccess);
if (rc != Success)
return rc;

View file

@ -125,7 +125,7 @@ ProcXGrabDeviceButton(ClientPtr client)
}
else {
mdev = PickKeyboard(client);
ret = XaceHook(XACE_DEVICE_ACCESS, client, mdev, DixUseAccess);
ret = XaceHookDeviceAccess(client, mdev, DixUseAccess);
if (ret != Success)
return ret;
}

View file

@ -123,7 +123,7 @@ ProcXGrabDeviceKey(ClientPtr client)
}
else {
mdev = PickKeyboard(client);
ret = XaceHook(XACE_DEVICE_ACCESS, client, mdev, DixUseAccess);
ret = XaceHookDeviceAccess(client, mdev, DixUseAccess);
if (ret != Success)
return ret;
}

View file

@ -309,7 +309,7 @@ ShouldSkipDevice(ClientPtr client, DeviceIntPtr d)
{
/* don't send master devices other than VCP/VCK */
if (!IsMaster(d) || d == inputInfo.pointer ||d == inputInfo.keyboard) {
int rc = XaceHook(XACE_DEVICE_ACCESS, client, d, DixGetAttrAccess);
int rc = XaceHookDeviceAccess(client, d, DixGetAttrAccess);
if (rc == Success)
return FALSE;

View file

@ -178,7 +178,7 @@ ShouldSkipDevice(ClientPtr client, int deviceid, DeviceIntPtr dev)
{
/* if all devices are not being queried, only master devices are */
if (deviceid == XIAllDevices || IsMaster(dev)) {
int rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixGetAttrAccess);
int rc = XaceHookDeviceAccess(client, dev, DixGetAttrAccess);
if (rc == Success)
return FALSE;
@ -575,7 +575,7 @@ ListDeviceClasses(ClientPtr client, DeviceIntPtr dev,
int rc;
/* Check if the current device state should be suppressed */
rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixReadAccess);
rc = XaceHookDeviceAccess(client, dev, DixReadAccess);
if (dev->button) {
(*nclasses)++;

View file

@ -294,7 +294,7 @@ AddInputDevice(ClientPtr client, DeviceProc deviceProc, Bool autoStart)
/* security creation/labeling check
*/
if (XaceHook(XACE_DEVICE_ACCESS, client, dev, DixCreateAccess)) {
if (XaceHookDeviceAccess(client, dev, DixCreateAccess)) {
dixFreePrivates(dev->devPrivates, PRIVATE_DEVICE);
free(dev);
return NULL;
@ -1262,7 +1262,7 @@ dixLookupDevice(DeviceIntPtr *pDev, int id, ClientPtr client, Mask access_mode)
return BadDevice;
found:
rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, access_mode);
rc = XaceHookDeviceAccess(client, dev, access_mode);
if (rc == Success)
*pDev = dev;
return rc;
@ -1842,7 +1842,7 @@ ProcChangeKeyboardMapping(ClientPtr client)
keysyms.mapWidth = stuff->keySymsPerKeyCode;
keysyms.map = (KeySym *) &stuff[1];
rc = XaceHook(XACE_DEVICE_ACCESS, client, pDev, DixManageAccess);
rc = XaceHookDeviceAccess(client, pDev, DixManageAccess);
if (rc != Success)
return rc;
@ -1855,7 +1855,7 @@ ProcChangeKeyboardMapping(ClientPtr client)
if (!tmp->key)
continue;
rc = XaceHook(XACE_DEVICE_ACCESS, client, pDev, DixManageAccess);
rc = XaceHookDeviceAccess(client, pDev, DixManageAccess);
if (rc != Success)
continue;
@ -1936,7 +1936,7 @@ ProcGetKeyboardMapping(ClientPtr client)
REQUEST(xGetKeyboardMappingReq);
REQUEST_SIZE_MATCH(xGetKeyboardMappingReq);
rc = XaceHook(XACE_DEVICE_ACCESS, client, kbd, DixGetAttrAccess);
rc = XaceHookDeviceAccess(client, kbd, DixGetAttrAccess);
if (rc != Success)
return rc;
@ -1989,7 +1989,7 @@ ProcGetPointerMapping(ClientPtr client)
REQUEST_SIZE_MATCH(xReq);
rc = XaceHook(XACE_DEVICE_ACCESS, client, ptr, DixGetAttrAccess);
rc = XaceHookDeviceAccess(client, ptr, DixGetAttrAccess);
if (rc != Success)
return rc;
@ -2215,7 +2215,7 @@ ProcChangeKeyboardControl(ClientPtr client)
if ((pDev == keyboard ||
(!IsMaster(pDev) && GetMaster(pDev, MASTER_KEYBOARD) == keyboard))
&& pDev->kbdfeed && pDev->kbdfeed->CtrlProc) {
ret = XaceHook(XACE_DEVICE_ACCESS, client, pDev, DixManageAccess);
ret = XaceHookDeviceAccess(client, pDev, DixManageAccess);
if (ret != Success)
return ret;
}
@ -2244,7 +2244,7 @@ ProcGetKeyboardControl(ClientPtr client)
REQUEST_SIZE_MATCH(xReq);
rc = XaceHook(XACE_DEVICE_ACCESS, client, kbd, DixGetAttrAccess);
rc = XaceHookDeviceAccess(client, kbd, DixGetAttrAccess);
if (rc != Success)
return rc;
@ -2292,7 +2292,7 @@ ProcBell(ClientPtr client)
(!IsMaster(dev) && GetMaster(dev, MASTER_KEYBOARD) == keybd)) &&
((dev->kbdfeed && dev->kbdfeed->BellProc) || dev->xkb_interest)) {
rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixBellAccess);
rc = XaceHookDeviceAccess(client, dev, DixBellAccess);
if (rc != Success)
return rc;
XkbHandleBell(FALSE, FALSE, dev, newpercent,
@ -2365,7 +2365,7 @@ ProcChangePointerControl(ClientPtr client)
if ((dev == mouse ||
(!IsMaster(dev) && GetMaster(dev, MASTER_POINTER) == mouse)) &&
dev->ptrfeed) {
rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixManageAccess);
rc = XaceHookDeviceAccess(client, dev, DixManageAccess);
if (rc != Success)
return rc;
}
@ -2397,7 +2397,7 @@ ProcGetPointerControl(ClientPtr client)
REQUEST_SIZE_MATCH(xReq);
rc = XaceHook(XACE_DEVICE_ACCESS, client, ptr, DixGetAttrAccess);
rc = XaceHookDeviceAccess(client, ptr, DixGetAttrAccess);
if (rc != Success)
return rc;
@ -2446,7 +2446,7 @@ ProcGetMotionEvents(ClientPtr client)
rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
if (rc != Success)
return rc;
rc = XaceHook(XACE_DEVICE_ACCESS, client, mouse, DixReadAccess);
rc = XaceHookDeviceAccess(client, mouse, DixReadAccess);
if (rc != Success)
return rc;
@ -2510,7 +2510,7 @@ ProcQueryKeymap(ClientPtr client)
.length = 2
};
rc = XaceHook(XACE_DEVICE_ACCESS, client, keybd, DixReadAccess);
rc = XaceHookDeviceAccess(client, keybd, DixReadAccess);
/* If rc is Success, we're allowed to copy out the keymap.
* If it's BadAccess, we leave it empty & lie to the client.
*/

View file

@ -3628,7 +3628,7 @@ ProcWarpPointer(ClientPtr client)
for (tmp = inputInfo.devices; tmp; tmp = tmp->next) {
if (GetMaster(tmp, MASTER_ATTACHED) == dev) {
rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixWriteAccess);
rc = XaceHookDeviceAccess(client, dev, DixWriteAccess);
if (rc != Success)
return rc;
}
@ -4707,7 +4707,7 @@ CoreEnterLeaveEvent(DeviceIntPtr mouse,
ClientPtr client = grab ? rClient(grab) : wClient(pWin);
int rc;
rc = XaceHook(XACE_DEVICE_ACCESS, client, keybd, DixReadAccess);
rc = XaceHookDeviceAccess(client, keybd, DixReadAccess);
if (rc == Success)
memcpy((char *) &ke.map[0], (char *) &keybd->key->down[1], 31);
@ -4818,7 +4818,7 @@ CoreFocusEvent(DeviceIntPtr dev, int type, int mode, int detail, WindowPtr pWin)
ClientPtr client = wClient(pWin);
int rc;
rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixReadAccess);
rc = XaceHookDeviceAccess(client, dev, DixReadAccess);
if (rc == Success)
memcpy((char *) &ke.map[0], (char *) &dev->key->down[1], 31);
@ -4881,7 +4881,7 @@ SetInputFocus(ClientPtr client,
if (!focusWin->realized)
return BadMatch;
}
rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixSetFocusAccess);
rc = XaceHookDeviceAccess(client, dev, DixSetFocusAccess);
if (rc != Success)
return Success;
@ -4959,7 +4959,7 @@ ProcGetInputFocus(ClientPtr client)
/* REQUEST(xReq); */
REQUEST_SIZE_MATCH(xReq);
rc = XaceHook(XACE_DEVICE_ACCESS, client, kbd, DixGetFocusAccess);
rc = XaceHookDeviceAccess(client, kbd, DixGetFocusAccess);
if (rc != Success)
return rc;
@ -5193,7 +5193,7 @@ GrabDevice(ClientPtr client, DeviceIntPtr dev,
if (keyboard_mode == GrabModeSync || pointer_mode == GrabModeSync)
access_mode |= DixFreezeAccess;
rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, access_mode);
rc = XaceHookDeviceAccess(client, dev, access_mode);
if (rc != Success)
return rc;
@ -5332,7 +5332,7 @@ ProcQueryPointer(ClientPtr client)
rc = dixLookupWindow(&pWin, stuff->id, client, DixGetAttrAccess);
if (rc != Success)
return rc;
rc = XaceHook(XACE_DEVICE_ACCESS, client, mouse, DixReadAccess);
rc = XaceHookDeviceAccess(client, mouse, DixReadAccess);
if (rc != Success && rc != BadAccess)
return rc;
@ -5732,7 +5732,7 @@ ProcGrabButton(ClientPtr client)
if (stuff->pointerMode == GrabModeSync ||
stuff->keyboardMode == GrabModeSync)
access_mode |= DixFreezeAccess;
rc = XaceHook(XACE_DEVICE_ACCESS, client, ptr, access_mode);
rc = XaceHookDeviceAccess(client, ptr, access_mode);
if (rc != Success)
return rc;
@ -6138,7 +6138,7 @@ WriteEventsToClient(ClientPtr pClient, int count, xEvent *events)
int
SetClientPointer(ClientPtr client, DeviceIntPtr device)
{
int rc = XaceHook(XACE_DEVICE_ACCESS, client, device, DixUseAccess);
int rc = XaceHookDeviceAccess(client, device, DixUseAccess);
if (rc != Success)
return rc;

View file

@ -544,7 +544,7 @@ AddPassiveGrabToList(ClientPtr client, GrabPtr pGrab)
if (pGrab->keyboardMode == GrabModeSync ||
pGrab->pointerMode == GrabModeSync)
access_mode |= DixFreezeAccess;
rc = XaceHook(XACE_DEVICE_ACCESS, client, pGrab->device, access_mode);
rc = XaceHookDeviceAccess(client, pGrab->device, access_mode);
if (rc != Success)
return rc;

View file

@ -53,7 +53,7 @@ check_butmap_change(DeviceIntPtr dev, CARD8 *map, int len, CARD32 *errval_out,
return BadDevice;
}
ret = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixManageAccess);
ret = XaceHookDeviceAccess(client, dev, DixManageAccess);
if (ret != Success) {
client->errorValue = dev->id;
return ret;
@ -134,7 +134,7 @@ check_modmap_change(ClientPtr client, DeviceIntPtr dev, KeyCode *modmap)
int ret, i;
XkbDescPtr xkb;
ret = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixManageAccess);
ret = XaceHookDeviceAccess(client, dev, DixManageAccess);
if (ret != Success)
return ret;
@ -292,7 +292,7 @@ generate_modkeymap(ClientPtr client, DeviceIntPtr dev,
KeyCode *modkeymap = NULL;
int i, j, ret;
ret = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixGetAttrAccess);
ret = XaceHookDeviceAccess(client, dev, DixGetAttrAccess);
if (ret != Success)
return ret;

View file

@ -559,7 +559,7 @@ ProcXkbBell(ClientPtr client)
for (other = inputInfo.devices; other; other = other->next) {
if ((other != dev) && other->key && !IsMaster(other) &&
GetMaster(other, MASTER_KEYBOARD) == dev) {
rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixBellAccess);
rc = XaceHookDeviceAccess(client, other, DixBellAccess);
if (rc == Success)
_XkbBell(client, other, pWin, stuff->bellClass,
stuff->bellID, stuff->pitch, stuff->duration,
@ -2746,8 +2746,7 @@ ProcXkbSetMap(ClientPtr client)
for (other = inputInfo.devices; other; other = other->next) {
if ((other != dev) && other->key && !IsMaster(other) &&
GetMaster(other, MASTER_KEYBOARD) == dev) {
rc = XaceHook(XACE_DEVICE_ACCESS, client, other,
DixManageAccess);
rc = XaceHookDeviceAccess(client, other, DixManageAccess);
if (rc == Success) {
rc = _XkbSetMapChecks(client, other, stuff, tmp, FALSE);
if (rc != Success)
@ -2780,8 +2779,7 @@ ProcXkbSetMap(ClientPtr client)
for (other = inputInfo.devices; other; other = other->next) {
if ((other != dev) && other->key && !IsMaster(other) &&
GetMaster(other, MASTER_KEYBOARD) == dev) {
rc = XaceHook(XACE_DEVICE_ACCESS, client, other,
DixManageAccess);
rc = XaceHookDeviceAccess(client, other, DixManageAccess);
if (rc == Success)
_XkbSetMap(client, other, stuff, tmp);
/* ignore rc. if the SetMap failed although the check above
@ -3120,8 +3118,7 @@ ProcXkbSetCompatMap(ClientPtr client)
for (other = inputInfo.devices; other; other = other->next) {
if ((other != dev) && other->key && !IsMaster(other) &&
GetMaster(other, MASTER_KEYBOARD) == dev) {
rc = XaceHook(XACE_DEVICE_ACCESS, client, other,
DixManageAccess);
rc = XaceHookDeviceAccess(client, other, DixManageAccess);
if (rc == Success) {
/* dry-run */
rc = _XkbSetCompatMap(client, other, stuff, data, TRUE);
@ -3142,8 +3139,7 @@ ProcXkbSetCompatMap(ClientPtr client)
for (other = inputInfo.devices; other; other = other->next) {
if ((other != dev) && other->key && !IsMaster(other) &&
GetMaster(other, MASTER_KEYBOARD) == dev) {
rc = XaceHook(XACE_DEVICE_ACCESS, client, other,
DixManageAccess);
rc = XaceHookDeviceAccess(client, other, DixManageAccess);
if (rc == Success) {
rc = _XkbSetCompatMap(client, other, stuff, data, FALSE);
if (rc != Success)
@ -3404,8 +3400,7 @@ ProcXkbSetIndicatorMap(ClientPtr client)
for (other = inputInfo.devices; other; other = other->next) {
if ((other != dev) && other->key && !IsMaster(other) &&
GetMaster(other, MASTER_KEYBOARD) == dev) {
rc = XaceHook(XACE_DEVICE_ACCESS, client, other,
DixSetAttrAccess);
rc = XaceHookDeviceAccess(client, other, DixSetAttrAccess);
if (rc == Success)
_XkbSetIndicatorMap(client, other, stuff->which, from);
}
@ -3673,7 +3668,7 @@ ProcXkbSetNamedIndicator(ClientPtr client)
if ((other != dev) && !IsMaster(other) &&
GetMaster(other, MASTER_KEYBOARD) == dev && (other->kbdfeed ||
other->leds) &&
(XaceHook(XACE_DEVICE_ACCESS, client, other, DixSetAttrAccess)
(XaceHookDeviceAccess(client, other, DixSetAttrAccess)
== Success)) {
rc = _XkbCreateIndicatorMap(other, stuff->indicator,
stuff->ledClass, stuff->ledID, &map,
@ -3697,7 +3692,7 @@ ProcXkbSetNamedIndicator(ClientPtr client)
if ((other != dev) && !IsMaster(other) &&
GetMaster(other, MASTER_KEYBOARD) == dev && (other->kbdfeed ||
other->leds) &&
(XaceHook(XACE_DEVICE_ACCESS, client, other, DixSetAttrAccess)
(XaceHookDeviceAccess(client, other, DixSetAttrAccess)
== Success)) {
_XkbSetNamedIndicator(client, other, stuff);
}
@ -4536,8 +4531,7 @@ ProcXkbSetNames(ClientPtr client)
if ((other != dev) && other->key && !IsMaster(other) &&
GetMaster(other, MASTER_KEYBOARD) == dev) {
rc = XaceHook(XACE_DEVICE_ACCESS, client, other,
DixManageAccess);
rc = XaceHookDeviceAccess(client, other, DixManageAccess);
if (rc == Success) {
rc = _XkbSetNamesCheck(client, other, stuff, tmp);
if (rc != Success)
@ -4560,8 +4554,7 @@ ProcXkbSetNames(ClientPtr client)
if ((other != dev) && other->key && !IsMaster(other) &&
GetMaster(other, MASTER_KEYBOARD) == dev) {
rc = XaceHook(XACE_DEVICE_ACCESS, client, other,
DixManageAccess);
rc = XaceHookDeviceAccess(client, other, DixManageAccess);
if (rc == Success)
_XkbSetNames(client, other, stuff);
}
@ -5689,8 +5682,7 @@ ProcXkbSetGeometry(ClientPtr client)
for (other = inputInfo.devices; other; other = other->next) {
if ((other != dev) && other->key && !IsMaster(other) &&
GetMaster(other, MASTER_KEYBOARD) == dev) {
rc = XaceHook(XACE_DEVICE_ACCESS, client, other,
DixManageAccess);
rc = XaceHookDeviceAccess(client, other, DixManageAccess);
if (rc == Success)
_XkbSetGeometry(client, other, stuff);
}
@ -6915,8 +6907,7 @@ ProcXkbSetDeviceInfo(ClientPtr client)
GetMaster(other, MASTER_KEYBOARD) == dev) &&
((stuff->deviceSpec == XkbUseCoreKbd && other->key) ||
(stuff->deviceSpec == XkbUseCorePtr && other->button))) {
rc = XaceHook(XACE_DEVICE_ACCESS, client, other,
DixManageAccess);
rc = XaceHookDeviceAccess(client, other, DixManageAccess);
if (rc == Success) {
rc = _XkbSetDeviceInfoCheck(client, other, stuff);
if (rc != Success)
@ -6940,8 +6931,7 @@ ProcXkbSetDeviceInfo(ClientPtr client)
GetMaster(other, MASTER_KEYBOARD) == dev) &&
((stuff->deviceSpec == XkbUseCoreKbd && other->key) ||
(stuff->deviceSpec == XkbUseCorePtr && other->button))) {
rc = XaceHook(XACE_DEVICE_ACCESS, client, other,
DixManageAccess);
rc = XaceHookDeviceAccess(client, other, DixManageAccess);
if (rc == Success) {
rc = _XkbSetDeviceInfo(client, other, stuff);
if (rc != Success)