xace: typesafe hook function for XACE_RESOURCE_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:
parent
632a48a057
commit
ae3c573337
|
@ -997,7 +997,7 @@ ProcPanoramiXShmCreatePixmap(ClientPtr client)
|
|||
stuff->offset);
|
||||
|
||||
if (pMap) {
|
||||
result = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid,
|
||||
result = XaceHookResourceAccess(client, stuff->pid,
|
||||
X11_RESTYPE_PIXMAP, pMap, X11_RESTYPE_NONE, NULL, DixCreateAccess);
|
||||
if (result != Success) {
|
||||
pDraw->pScreen->DestroyPixmap(pMap);
|
||||
|
@ -1112,7 +1112,7 @@ ProcShmCreatePixmap(ClientPtr client)
|
|||
shmdesc->addr +
|
||||
stuff->offset);
|
||||
if (pMap) {
|
||||
rc = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, X11_RESTYPE_PIXMAP,
|
||||
rc = XaceHookResourceAccess(client, stuff->pid, X11_RESTYPE_PIXMAP,
|
||||
pMap, X11_RESTYPE_NONE, NULL, DixCreateAccess);
|
||||
if (rc != Success) {
|
||||
pDraw->pScreen->DestroyPixmap(pMap);
|
||||
|
|
22
Xext/xace.c
22
Xext/xace.c
|
@ -62,13 +62,21 @@ XaceHookSelectionAccess(ClientPtr client, Selection ** ppSel, Mask access_mode)
|
|||
return rec.status;
|
||||
}
|
||||
|
||||
int XaceHookResourceAccess(ClientPtr client, XID id, RESTYPE rtype, void *res,
|
||||
RESTYPE ptype, void *parent, Mask access_mode)
|
||||
{
|
||||
XaceResourceAccessRec rec = { client, id, rtype, res, ptype, parent,
|
||||
access_mode, Success };
|
||||
CallCallbacks(&XaceHooks[XACE_RESOURCE_ACCESS], &rec);
|
||||
return rec.status;
|
||||
}
|
||||
|
||||
/* Entry point for hook functions. Called by Xserver.
|
||||
*/
|
||||
int
|
||||
XaceHook(int hook, ...)
|
||||
{
|
||||
union {
|
||||
XaceResourceAccessRec res;
|
||||
XaceDeviceAccessRec dev;
|
||||
XaceSendAccessRec send;
|
||||
XaceReceiveAccessRec recv;
|
||||
|
@ -93,18 +101,6 @@ XaceHook(int hook, ...)
|
|||
* sets calldata directly to a single argument (with no return result)
|
||||
*/
|
||||
switch (hook) {
|
||||
case XACE_RESOURCE_ACCESS:
|
||||
u.res.client = va_arg(ap, ClientPtr);
|
||||
u.res.id = va_arg(ap, XID);
|
||||
u.res.rtype = va_arg(ap, RESTYPE);
|
||||
u.res.res = va_arg(ap, void *);
|
||||
u.res.ptype = va_arg(ap, RESTYPE);
|
||||
u.res.parent = va_arg(ap, void *);
|
||||
u.res.access_mode = va_arg(ap, Mask);
|
||||
|
||||
u.res.status = Success; /* default allow */
|
||||
prv = &u.res.status;
|
||||
break;
|
||||
case XACE_DEVICE_ACCESS:
|
||||
u.dev.client = va_arg(ap, ClientPtr);
|
||||
u.dev.dev = va_arg(ap, DeviceIntPtr);
|
||||
|
|
|
@ -78,6 +78,10 @@ int XaceHookPropertyAccess(ClientPtr ptr, WindowPtr pWin, PropertyPtr *ppProp,
|
|||
Mask access_mode);
|
||||
int XaceHookSelectionAccess(ClientPtr ptr, Selection ** ppSel, Mask access_mode);
|
||||
|
||||
/* needs to be exported for in-tree modsetting, but not part of public API */
|
||||
_X_EXPORT int XaceHookResourceAccess(ClientPtr client, XID id, RESTYPE rtype, void *res,
|
||||
RESTYPE ptype, void *parent, Mask access_mode);
|
||||
|
||||
/* Register a callback for a given hook.
|
||||
*/
|
||||
#define XaceRegisterCallback(hook,callback,data) \
|
||||
|
|
|
@ -252,7 +252,7 @@ ProcCompositeNameWindowPixmap(ClientPtr client)
|
|||
return BadMatch;
|
||||
|
||||
/* security creation/labeling check */
|
||||
rc = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pixmap, X11_RESTYPE_PIXMAP,
|
||||
rc = XaceHookResourceAccess(client, stuff->pixmap, X11_RESTYPE_PIXMAP,
|
||||
pPixmap, X11_RESTYPE_WINDOW, pWin, DixCreateAccess);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
|
@ -306,7 +306,7 @@ ProcCompositeGetOverlayWindow(ClientPtr client)
|
|||
return BadAlloc;
|
||||
}
|
||||
|
||||
rc = XaceHook(XACE_RESOURCE_ACCESS, client, cs->pOverlayWin->drawable.id,
|
||||
rc = XaceHookResourceAccess(client, cs->pOverlayWin->drawable.id,
|
||||
X11_RESTYPE_WINDOW, cs->pOverlayWin, X11_RESTYPE_NONE,
|
||||
NULL, DixGetAttrAccess);
|
||||
if (rc != Success) {
|
||||
|
@ -828,7 +828,7 @@ PanoramiXCompositeGetOverlayWindow(ClientPtr client)
|
|||
return BadAlloc;
|
||||
}
|
||||
|
||||
rc = XaceHook(XACE_RESOURCE_ACCESS, client,
|
||||
rc = XaceHookResourceAccess(client,
|
||||
cs->pOverlayWin->drawable.id,
|
||||
X11_RESTYPE_WINDOW, cs->pOverlayWin, X11_RESTYPE_NONE, NULL,
|
||||
DixGetAttrAccess);
|
||||
|
|
|
@ -169,9 +169,9 @@ miDbeAllocBackBufferName(WindowPtr pWin, XID bufId, int swapAction)
|
|||
}
|
||||
|
||||
/* Security creation/labeling check. */
|
||||
rc = XaceHook(XACE_RESOURCE_ACCESS, serverClient, bufId,
|
||||
dbeDrawableResType, pDbeWindowPriv->pBackBuffer,
|
||||
X11_RESTYPE_WINDOW, pWin, DixCreateAccess);
|
||||
rc = XaceHookResourceAccess(serverClient, bufId, dbeDrawableResType,
|
||||
pDbeWindowPriv->pBackBuffer, X11_RESTYPE_WINDOW,
|
||||
pWin, DixCreateAccess);
|
||||
|
||||
/* Make the back pixmap a DBE drawable resource. */
|
||||
if (rc != Success || !AddResource(bufId, dbeDrawableResType,
|
||||
|
|
|
@ -379,7 +379,7 @@ CreateColormap(Colormap mid, ScreenPtr pScreen, VisualPtr pVisual,
|
|||
/*
|
||||
* Security creation/labeling check
|
||||
*/
|
||||
i = XaceHook(XACE_RESOURCE_ACCESS, clients[client], mid, X11_RESTYPE_COLORMAP,
|
||||
i = XaceHookResourceAccess(clients[client], mid, X11_RESTYPE_COLORMAP,
|
||||
pmap, X11_RESTYPE_NONE, NULL, DixCreateAccess);
|
||||
if (i != Success) {
|
||||
FreeResource(mid, X11_RESTYPE_NONE);
|
||||
|
|
|
@ -279,7 +279,7 @@ AllocARGBCursor(unsigned char *psrcbits, unsigned char *pmaskbits,
|
|||
pCurs->id = cid;
|
||||
|
||||
/* security creation/labeling check */
|
||||
rc = XaceHook(XACE_RESOURCE_ACCESS, client, cid, X11_RESTYPE_CURSOR,
|
||||
rc = XaceHookResourceAccess(client, cid, X11_RESTYPE_CURSOR,
|
||||
pCurs, X11_RESTYPE_NONE, NULL, DixCreateAccess);
|
||||
if (rc != Success)
|
||||
goto error;
|
||||
|
@ -459,7 +459,7 @@ AllocGlyphCursor(Font source, unsigned sourceChar, Font mask, unsigned maskChar,
|
|||
pCurs->id = cid;
|
||||
|
||||
/* security creation/labeling check */
|
||||
rc = XaceHook(XACE_RESOURCE_ACCESS, client, cid, X11_RESTYPE_CURSOR,
|
||||
rc = XaceHookResourceAccess(client, cid, X11_RESTYPE_CURSOR,
|
||||
pCurs, X11_RESTYPE_NONE, NULL, DixCreateAccess);
|
||||
if (rc != Success)
|
||||
goto error;
|
||||
|
|
|
@ -1518,7 +1518,7 @@ ProcCreatePixmap(ClientPtr client)
|
|||
pMap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
|
||||
pMap->drawable.id = stuff->pid;
|
||||
/* security creation/labeling check */
|
||||
rc = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, X11_RESTYPE_PIXMAP,
|
||||
rc = XaceHookResourceAccess(client, stuff->pid, X11_RESTYPE_PIXMAP,
|
||||
pMap, X11_RESTYPE_NONE, NULL, DixCreateAccess);
|
||||
if (rc != Success) {
|
||||
(*pDraw->pScreen->DestroyPixmap) (pMap);
|
||||
|
|
|
@ -4531,7 +4531,7 @@ EventSelectForWindow(WindowPtr pWin, ClientPtr client, Mask mask)
|
|||
}
|
||||
check = (mask & ManagerMask);
|
||||
if (check) {
|
||||
rc = XaceHook(XACE_RESOURCE_ACCESS, client, pWin->drawable.id,
|
||||
rc = XaceHookResourceAccess(client, pWin->drawable.id,
|
||||
X11_RESTYPE_WINDOW, pWin, X11_RESTYPE_NONE, NULL, DixManageAccess);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
|
|
2
dix/gc.c
2
dix/gc.c
|
@ -549,7 +549,7 @@ CreateGC(DrawablePtr pDrawable, BITS32 mask, XID *pval, int *pStatus,
|
|||
}
|
||||
|
||||
/* security creation/labeling check */
|
||||
*pStatus = XaceHook(XACE_RESOURCE_ACCESS, client, gcid, X11_RESTYPE_GC, pGC,
|
||||
*pStatus = XaceHookResourceAccess(client, gcid, X11_RESTYPE_GC, pGC,
|
||||
X11_RESTYPE_NONE, NULL, DixCreateAccess | DixSetAttrAccess);
|
||||
if (*pStatus != Success)
|
||||
goto out;
|
||||
|
|
|
@ -1223,7 +1223,7 @@ dixLookupResourceByType(void **result, XID id, RESTYPE rtype,
|
|||
return resourceTypes[rtype & TypeMask].errorValue;
|
||||
|
||||
if (client) {
|
||||
cid = XaceHook(XACE_RESOURCE_ACCESS, client, id, res->type,
|
||||
cid = XaceHookResourceAccess(client, id, res->type,
|
||||
res->value, X11_RESTYPE_NONE, NULL, mode);
|
||||
if (cid == BadValue)
|
||||
return resourceTypes[rtype & TypeMask].errorValue;
|
||||
|
@ -1258,7 +1258,7 @@ dixLookupResourceByClass(void **result, XID id, RESTYPE rclass,
|
|||
return BadValue;
|
||||
|
||||
if (client) {
|
||||
cid = XaceHook(XACE_RESOURCE_ACCESS, client, id, res->type,
|
||||
cid = XaceHookResourceAccess(client, id, res->type,
|
||||
res->value, X11_RESTYPE_NONE, NULL, mode);
|
||||
if (cid != Success)
|
||||
return cid;
|
||||
|
|
10
dix/window.c
10
dix/window.c
|
@ -638,7 +638,7 @@ CreateRootWindow(ScreenPtr pScreen)
|
|||
|
||||
/* security creation/labeling check
|
||||
*/
|
||||
if (XaceHook(XACE_RESOURCE_ACCESS, serverClient, pWin->drawable.id,
|
||||
if (XaceHookResourceAccess(serverClient, pWin->drawable.id,
|
||||
X11_RESTYPE_WINDOW, pWin, X11_RESTYPE_NONE, NULL, DixCreateAccess))
|
||||
return FALSE;
|
||||
|
||||
|
@ -867,7 +867,7 @@ CreateWindow(Window wid, WindowPtr pParent, int x, int y, unsigned w,
|
|||
|
||||
/* security creation/labeling check
|
||||
*/
|
||||
*error = XaceHook(XACE_RESOURCE_ACCESS, client, wid, X11_RESTYPE_WINDOW, pWin,
|
||||
*error = XaceHookResourceAccess(client, wid, X11_RESTYPE_WINDOW, pWin,
|
||||
X11_RESTYPE_WINDOW, pWin->parent,
|
||||
DixCreateAccess | DixSetAttrAccess);
|
||||
if (*error != Success) {
|
||||
|
@ -1115,7 +1115,7 @@ DestroySubwindows(WindowPtr pWin, ClientPtr client)
|
|||
*/
|
||||
UnmapSubwindows(pWin);
|
||||
while (pWin->lastChild) {
|
||||
int rc = XaceHook(XACE_RESOURCE_ACCESS, client,
|
||||
int rc = XaceHookResourceAccess(client,
|
||||
pWin->lastChild->drawable.id, X11_RESTYPE_WINDOW,
|
||||
pWin->lastChild, X11_RESTYPE_NONE, NULL, DixDestroyAccess);
|
||||
|
||||
|
@ -1397,7 +1397,7 @@ ChangeWindowAttributes(WindowPtr pWin, Mask vmask, XID *vlist, ClientPtr client)
|
|||
goto PatchUp;
|
||||
}
|
||||
if (val == xTrue) {
|
||||
rc = XaceHook(XACE_RESOURCE_ACCESS, client, pWin->drawable.id,
|
||||
rc = XaceHookResourceAccess(client, pWin->drawable.id,
|
||||
X11_RESTYPE_WINDOW, pWin, X11_RESTYPE_NONE, NULL, DixGrabAccess);
|
||||
if (rc != Success) {
|
||||
error = rc;
|
||||
|
@ -2664,7 +2664,7 @@ MapWindow(WindowPtr pWin, ClientPtr client)
|
|||
return Success;
|
||||
|
||||
/* general check for permission to map window */
|
||||
if (XaceHook(XACE_RESOURCE_ACCESS, client, pWin->drawable.id, X11_RESTYPE_WINDOW,
|
||||
if (XaceHookResourceAccess(client, pWin->drawable.id, X11_RESTYPE_WINDOW,
|
||||
pWin, X11_RESTYPE_NONE, NULL, DixShowAccess) != Success)
|
||||
return Success;
|
||||
|
||||
|
|
|
@ -239,7 +239,7 @@ proc_dri3_pixmap_from_buffer(ClientPtr client)
|
|||
pixmap->drawable.id = stuff->pixmap;
|
||||
|
||||
/* security creation/labeling check */
|
||||
rc = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pixmap, X11_RESTYPE_PIXMAP,
|
||||
rc = XaceHookResourceAccess(client, stuff->pixmap, X11_RESTYPE_PIXMAP,
|
||||
pixmap, X11_RESTYPE_NONE, NULL, DixCreateAccess);
|
||||
|
||||
if (rc != Success) {
|
||||
|
@ -503,7 +503,7 @@ proc_dri3_pixmap_from_buffers(ClientPtr client)
|
|||
pixmap->drawable.id = stuff->pixmap;
|
||||
|
||||
/* security creation/labeling check */
|
||||
rc = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pixmap, X11_RESTYPE_PIXMAP,
|
||||
rc = XaceHookResourceAccess(client, stuff->pixmap, X11_RESTYPE_PIXMAP,
|
||||
pixmap, X11_RESTYPE_NONE, NULL, DixCreateAccess);
|
||||
|
||||
if (rc != Success) {
|
||||
|
|
|
@ -1395,7 +1395,7 @@ DoCreatePbuffer(ClientPtr client, int screenNum, XID fbconfigId,
|
|||
if (!pPixmap)
|
||||
return BadAlloc;
|
||||
|
||||
err = XaceHook(XACE_RESOURCE_ACCESS, client, glxDrawableId, X11_RESTYPE_PIXMAP,
|
||||
err = XaceHookResourceAccess(client, glxDrawableId, X11_RESTYPE_PIXMAP,
|
||||
pPixmap, X11_RESTYPE_NONE, NULL, DixCreateAccess);
|
||||
if (err != Success) {
|
||||
(*pGlxScreen->pScreen->DestroyPixmap) (pPixmap);
|
||||
|
|
|
@ -336,7 +336,7 @@ AnimCursorCreate(CursorPtr *cursors, CARD32 *deltas, int ncursor,
|
|||
|
||||
/* security creation/labeling check */
|
||||
if (ac->timer)
|
||||
rc = XaceHook(XACE_RESOURCE_ACCESS, client, cid, X11_RESTYPE_CURSOR, pCursor,
|
||||
rc = XaceHookResourceAccess(client, cid, X11_RESTYPE_CURSOR, pCursor,
|
||||
X11_RESTYPE_NONE, NULL, DixCreateAccess);
|
||||
|
||||
if (rc != Success) {
|
||||
|
|
|
@ -760,7 +760,7 @@ CreatePicture(Picture pid,
|
|||
pPicture->format = pFormat->format | (pDrawable->bitsPerPixel << 24);
|
||||
|
||||
/* security creation/labeling check */
|
||||
*error = XaceHook(XACE_RESOURCE_ACCESS, client, pid, PictureType, pPicture,
|
||||
*error = XaceHookResourceAccess(client, pid, PictureType, pPicture,
|
||||
X11_RESTYPE_PIXMAP, pDrawable, DixCreateAccess | DixSetAttrAccess);
|
||||
if (*error != Success)
|
||||
goto out;
|
||||
|
|
|
@ -929,7 +929,7 @@ ProcRenderCreateGlyphSet(ClientPtr client)
|
|||
if (!glyphSet)
|
||||
return BadAlloc;
|
||||
/* security creation/labeling check */
|
||||
rc = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->gsid, GlyphSetType,
|
||||
rc = XaceHookResourceAccess(client, stuff->gsid, GlyphSetType,
|
||||
glyphSet, X11_RESTYPE_NONE, NULL, DixCreateAccess);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
|
@ -1862,7 +1862,7 @@ ProcRenderCreateSolidFill(ClientPtr client)
|
|||
if (!pPicture)
|
||||
return error;
|
||||
/* security creation/labeling check */
|
||||
error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType,
|
||||
error = XaceHookResourceAccess(client, stuff->pid, PictureType,
|
||||
pPicture, X11_RESTYPE_NONE, NULL, DixCreateAccess);
|
||||
if (error != Success)
|
||||
return error;
|
||||
|
@ -1901,7 +1901,7 @@ ProcRenderCreateLinearGradient(ClientPtr client)
|
|||
if (!pPicture)
|
||||
return error;
|
||||
/* security creation/labeling check */
|
||||
error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType,
|
||||
error = XaceHookResourceAccess(client, stuff->pid, PictureType,
|
||||
pPicture, X11_RESTYPE_NONE, NULL, DixCreateAccess);
|
||||
if (error != Success)
|
||||
return error;
|
||||
|
@ -1941,7 +1941,7 @@ ProcRenderCreateRadialGradient(ClientPtr client)
|
|||
if (!pPicture)
|
||||
return error;
|
||||
/* security creation/labeling check */
|
||||
error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType,
|
||||
error = XaceHookResourceAccess(client, stuff->pid, PictureType,
|
||||
pPicture, X11_RESTYPE_NONE, NULL, DixCreateAccess);
|
||||
if (error != Success)
|
||||
return error;
|
||||
|
@ -1980,7 +1980,7 @@ ProcRenderCreateConicalGradient(ClientPtr client)
|
|||
if (!pPicture)
|
||||
return error;
|
||||
/* security creation/labeling check */
|
||||
error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType,
|
||||
error = XaceHookResourceAccess(client, stuff->pid, PictureType,
|
||||
pPicture, X11_RESTYPE_NONE, NULL, DixCreateAccess);
|
||||
if (error != Success)
|
||||
return error;
|
||||
|
|
|
@ -373,7 +373,7 @@ ProcXFixesGetCursorImage(ClientPtr client)
|
|||
pCursor = CursorForClient(client);
|
||||
if (!pCursor)
|
||||
return BadCursor;
|
||||
rc = XaceHook(XACE_RESOURCE_ACCESS, client, pCursor->id, X11_RESTYPE_CURSOR,
|
||||
rc = XaceHookResourceAccess(client, pCursor->id, X11_RESTYPE_CURSOR,
|
||||
pCursor, X11_RESTYPE_NONE, NULL, DixReadAccess);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
|
@ -522,7 +522,7 @@ ProcXFixesGetCursorImageAndName(ClientPtr client)
|
|||
pCursor = CursorForClient(client);
|
||||
if (!pCursor)
|
||||
return BadCursor;
|
||||
rc = XaceHook(XACE_RESOURCE_ACCESS, client, pCursor->id, X11_RESTYPE_CURSOR,
|
||||
rc = XaceHookResourceAccess(client, pCursor->id, X11_RESTYPE_CURSOR,
|
||||
pCursor, X11_RESTYPE_NONE, NULL, DixReadAccess | DixGetAttrAccess);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
|
|
Loading…
Reference in New Issue