From a853080724566ad1b60759c1b35994f8d288ab2e Mon Sep 17 00:00:00 2001 From: "Enrico Weigelt, metux IT consult" Date: Wed, 19 Mar 2025 13:53:26 +0100 Subject: [PATCH] HACK: DEBUG --- Xext/namespace/hook-receive.c | 3 ++ Xext/namespace/hook-selection.c | 43 +++++++++++++++++++++++++++- Xext/namespace/hook-windowproperty.c | 28 ++++++++++++++++-- Xext/sync.c | 2 ++ Xi/xiselectev.c | 19 +++++++++++- 5 files changed, 91 insertions(+), 4 deletions(-) diff --git a/Xext/namespace/hook-receive.c b/Xext/namespace/hook-receive.c index 4613be3a9..9da3eb187 100644 --- a/Xext/namespace/hook-receive.c +++ b/Xext/namespace/hook-receive.c @@ -34,6 +34,9 @@ hookReceive(CallbackListPtr *pcbl, void *unused, void *calldata) if (gev->extension == EXTENSION_MAJOR_XINPUT) { switch (gev->evtype) { case XI_RawMotion: + XNS_HOOK_LOG("RawMotion winid=0x%0x%s\n", + param->pWin->drawable.id, + isRootWin(param->pWin) ? " (root window)" : ""); if ((!subj->ns->allowMouseMotion) || !isRootWin(param->pWin)) goto reject; continue; diff --git a/Xext/namespace/hook-selection.c b/Xext/namespace/hook-selection.c index f0edf27ad..2b8ed2790 100644 --- a/Xext/namespace/hook-selection.c +++ b/Xext/namespace/hook-selection.c @@ -36,6 +36,25 @@ void hookSelectionFilter(CallbackListPtr *pcbl, void *unused, void *calldata) if (subj->ns->superPower) return; + const char *op = "<>"; + switch (param->op) { + case SELECTION_FILTER_GETOWNER: + op = "SELECTION_FILTER_GETOWNER"; + break; + case SELECTION_FILTER_SETOWNER: + op = "SELECTION_FILTER_SETOWNER"; + break; + case SELECTION_FILTER_CONVERT: + op = "SELECTION_FILTER_CONVERT"; + break; + case SELECTION_FILTER_EV_REQUEST: + op = "SELECTION_FILTER_EV_REQUEST"; + break; + case SELECTION_FILTER_EV_CLEAR: + op = "SELECTION_FILTER_EV_CLEAR"; + break; + } + const char *origSelectionName = NameForAtom(param->selection); char selname[PATH_MAX] = { 0 }; @@ -47,6 +66,11 @@ void hookSelectionFilter(CallbackListPtr *pcbl, void *unused, void *calldata) case SELECTION_FILTER_SETOWNER: case SELECTION_FILTER_CONVERT: case SELECTION_FILTER_LISTEN: + XNS_HOOK_LOG("%s origsel=%s (%d) newsel=%s (%d) -- using newsel\n", op, + origSelectionName, + param->selection, + selname, + realSelection); // TODO: check whether window really belongs to the client param->selection = realSelection; break; @@ -55,13 +79,30 @@ void hookSelectionFilter(CallbackListPtr *pcbl, void *unused, void *calldata) { // need to translate back, since we're having the ns-prefixed name here const char *stripped = stripNS(origSelectionName); - param->selection = MakeAtom(stripped, strlen(stripped), TRUE); + ATOM strippedAtom = MakeAtom(stripped, strlen(stripped), TRUE); + XNS_HOOK_LOG("NOTIFY stripped=\"%s\" atom=%d name=\"%s\n", stripped, strippedAtom, NameForAtom(strippedAtom)); + XNS_HOOK_LOG("NOTIFY origID %d origName %s transID %d transName %s strippedName %s atom %d\n", + param->selection, + origSelectionName, + realSelection, + selname, + stripped, + strippedAtom); + param->selection = strippedAtom; break; } // nothing to do here: already having the client visible name case SELECTION_FILTER_EV_REQUEST: case SELECTION_FILTER_EV_CLEAR: + XNS_HOOK_LOG("%s origsel=%s (%d) newsel=%s (%d) -- using origsel\n", op, + NameForAtom(param->selection), + param->selection, + selname, + realSelection); + break; + default: + XNS_HOOK_LOG("unknown op: %d selection=%d\n", param->op, param->selection); break; } } diff --git a/Xext/namespace/hook-windowproperty.c b/Xext/namespace/hook-windowproperty.c index f427c634f..70fec9f30 100644 --- a/Xext/namespace/hook-windowproperty.c +++ b/Xext/namespace/hook-windowproperty.c @@ -37,16 +37,40 @@ void hookWindowProperty(CallbackListPtr *pcbl, void *unused, void *calldata) // whitelist anything that goes to caller's own namespace struct XnamespaceClientPriv *obj = XnsClientPriv(owner); - if (XnsClientSameNS(subj, obj)) + if (XnsClientSameNS(subj, obj)) { + XNS_HOOK_LOG("same NS window property %s (atom 0x%x) window 0x%0x of client %d\n", + NameForAtom(param->property), + param->property, + param->window, + owner->index); return; + } // allow access to namespace virtual root - if (param->window == subj->ns->rootWindow->drawable.id) + if (param->window == subj->ns->rootWindow->drawable.id) { + XNS_HOOK_LOG("NS virtual root window property %s (atom 0x%x) window 0x%0x of client %d\n", + NameForAtom(param->property), + param->property, + param->window, + owner->index); return; + } // redirect root window access to namespace's virtual root if (dixWindowIsRoot(param->window)) { + XNS_HOOK_LOG("redirect root window property %s (atom 0x%x) window 0x%0x of client %d to 0x%x\n", + NameForAtom(param->property), + param->property, + param->window, + owner->index, + subj->ns->rootWindow->drawable.id); param->window = subj->ns->rootWindow->drawable.id; return; } + + XNS_HOOK_LOG("foreign NS window property %s (atom 0x%x) window 0x%0x of client %d\n", + NameForAtom(param->property), + param->property, + param->window, + owner->index); } diff --git a/Xext/sync.c b/Xext/sync.c index dfd757953..8c49f9dcc 100644 --- a/Xext/sync.c +++ b/Xext/sync.c @@ -1609,6 +1609,7 @@ ProcSyncAwait(ClientPtr client) SyncAwait *pAwait; int status; +// not sure whether we need to filter here REQUEST_AT_LEAST_SIZE(xSyncAwaitReq); len = client->req_len << 2; @@ -2059,6 +2060,7 @@ ProcSyncQueryFence(ClientPtr client) return Success; } +// not sure whether it needs to be filtered static int ProcSyncAwaitFence(ClientPtr client) { diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c index 4daee3b71..3532e37c5 100644 --- a/Xi/xiselectev.c +++ b/Xi/xiselectev.c @@ -162,8 +162,10 @@ ProcXISelectEvents(ClientPtr client) rc = dixLookupWindow(&win, stuff->win, client, DixReceiveAccess); // when access to the window is denied, just pretend everything's okay - if (rc == BadAccess) + if (rc == BadAccess) { + printf(" ==> ProcXISelectEvents() resource hook denied access to window 0x%0x\n", stuff->win); return Success; + } if (rc != Success) return rc; @@ -296,6 +298,21 @@ ProcXISelectEvents(ClientPtr client) evmask->mask_len * 4) != Success) return BadValue; + { + CARD32 *bits = (CARD32*)&evmask[1]; + printf("mask before: 0x%0x\n", *bits); + printf("subtracting: 0x%0x\n", (XI_RawKeyPressMask | XI_RawKeyReleaseMask | + XI_RawButtonPress | XI_RawButtonRelease | + XI_RawMotion | XI_RawTouchBegin | XI_RawTouchUpdate | + XI_RawTouchEnd)); +// (*bits) &= ~(XI_RawKeyPressMask | XI_RawKeyReleaseMask | +// XI_RawButtonPress | XI_RawButtonRelease | +// XI_RawMotion | XI_RawTouchBegin | XI_RawTouchUpdate | +// XI_RawTouchEnd); + printf("mask after: 0x%0x\n", *bits); + } + + // FIXME: possible buffer overflow ? evmask = (xXIEventMask *) (((unsigned char *) evmask) + evmask->mask_len * 4);