Xext: namespace: fix NULL derefence on client close

Removing the namespace assignment of killed clients in ClientState-hook
is too early - we still need it later. Using the new ClientDestroyCallback
instead.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
Enrico Weigelt, metux IT consult
2025-09-18 19:57:33 +02:00
parent bc53cfa275
commit e3b0007db1
3 changed files with 15 additions and 2 deletions

View File

@@ -33,13 +33,23 @@ void hookClientState(CallbackListPtr *pcbl, void *unused, void *calldata)
break;
case ClientStateRetained:
XnamespaceAssignClient(subj, NULL);
break;
case ClientStateGone:
XnamespaceAssignClient(subj, NULL);
break;
default:
XNS_HOOK_LOG("unknown state =%d\n", client->clientState);
break;
}
}
void hookClientDestroy(CallbackListPtr *pcbl, void *unused, void *calldata)
{
ClientPtr client = calldata;
struct XnamespaceClientPriv *subj = XnsClientPriv(client);
if (!subj)
return; /* no XNS devprivate assigned ? */
XnamespaceAssignClient(subj, NULL);
/* the devprivate is embedded, so no free() necessary */
}

View File

@@ -26,6 +26,7 @@
void hookClient(CallbackListPtr *pcbl, void *unused, void *calldata);
void hookClientState(CallbackListPtr *pcbl, void *unused, void *calldata);
void hookClientDestroy(CallbackListPtr *pcbl, void *unused, void *calldata);
void hookDevice(CallbackListPtr *pcbl, void *unused, void *calldata);
void hookExtAccess(CallbackListPtr *pcbl, void *unused, void *calldata);
void hookExtDispatch(CallbackListPtr *pcbl, void *unused, void *calldata);

View File

@@ -3,6 +3,7 @@
#include <stdio.h>
#include <X11/Xmd.h>
#include "dix/client_priv.h"
#include "dix/dix_priv.h"
#include "dix/property_priv.h"
#include "dix/selection_priv.h"
@@ -34,6 +35,7 @@ NamespaceExtensionInit(void)
AddCallback(&PostInitRootWindowCallback, hookInitRootWindow, NULL) &&
AddCallback(&PropertyFilterCallback, hookWindowProperty, NULL) &&
AddCallback(&SelectionFilterCallback, hookSelectionFilter, NULL) &&
AddCallback(&ClientDestroyCallback, hookClientDestroy, NULL) &&
XaceRegisterCallback(XACE_CLIENT_ACCESS, hookClient, NULL) &&
XaceRegisterCallback(XACE_DEVICE_ACCESS, hookDevice, NULL) &&
XaceRegisterCallback(XACE_EXT_DISPATCH, hookExtDispatch, NULL) &&