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>
This commit is contained in:
Enrico Weigelt, metux IT consult 2024-05-16 20:15:56 +02:00 committed by Marge Bot
parent ae3c573337
commit 9524ffee89
12 changed files with 57 additions and 67 deletions

View File

@ -71,13 +71,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;
@ -101,14 +107,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

@ -82,6 +82,8 @@ int XaceHookSelectionAccess(ClientPtr ptr, Selection ** ppSel, Mask access_mode)
_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

@ -2514,7 +2514,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);
@ -2570,7 +2570,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;
@ -2613,7 +2613,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;
@ -2644,7 +2644,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

@ -126,7 +126,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

@ -124,7 +124,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

@ -296,7 +296,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;
@ -1264,7 +1264,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;
@ -1844,7 +1844,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;
@ -1857,7 +1857,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;
@ -1938,7 +1938,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;
@ -1991,7 +1991,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;
@ -2217,7 +2217,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;
}
@ -2246,7 +2246,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;
@ -2294,7 +2294,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,
@ -2367,7 +2367,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;
}
@ -2399,7 +2399,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;
@ -2448,7 +2448,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;
@ -2512,7 +2512,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

@ -3626,7 +3626,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;
}
@ -4705,7 +4705,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);
@ -4816,7 +4816,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);
@ -4879,7 +4879,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;
@ -4957,7 +4957,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;
@ -5191,7 +5191,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;
@ -5330,7 +5330,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;
@ -5730,7 +5730,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;
@ -6136,7 +6136,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

@ -548,7 +548,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

@ -54,7 +54,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;
@ -135,7 +135,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;
@ -293,7 +293,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

@ -562,7 +562,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,
@ -2749,8 +2749,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)
@ -2783,8 +2782,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
@ -3123,8 +3121,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);
@ -3145,8 +3142,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)
@ -3407,8 +3403,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);
}
@ -3676,7 +3671,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,
@ -3700,7 +3695,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);
}
@ -4539,8 +4534,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)
@ -4563,8 +4557,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);
}
@ -5692,8 +5685,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);
}
@ -6918,8 +6910,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)
@ -6943,8 +6934,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)