From 3aabc92cf81f20b89dc49e8db3c56ad9fa08481b Mon Sep 17 00:00:00 2001 From: Ulrich Sibiller Date: Sat, 22 Jun 2019 16:03:06 +0200 Subject: rework xkb device private handling We can only free the xkbDevicePrivate because we do not know the details of any other (possible) extension. So let's limit to that one private for now and call the new xkbFreePrivates from dix (where such a function is completely missing). --- nx-X11/programs/Xserver/dix/devices.c | 9 +++++++++ nx-X11/programs/Xserver/hw/nxagent/Keyboard.c | 8 -------- nx-X11/programs/Xserver/hw/nxagent/Pointer.c | 8 -------- nx-X11/programs/Xserver/xkb/xkbActions.c | 14 ++++++++++++++ 4 files changed, 23 insertions(+), 16 deletions(-) (limited to 'nx-X11') diff --git a/nx-X11/programs/Xserver/dix/devices.c b/nx-X11/programs/Xserver/dix/devices.c index 8ad1cc371..3dee81a25 100644 --- a/nx-X11/programs/Xserver/dix/devices.c +++ b/nx-X11/programs/Xserver/dix/devices.c @@ -73,6 +73,8 @@ SOFTWARE. #include "swaprep.h" #include "dixevents.h" +extern void XkbFreePrivates(DeviceIntPtr device); + DeviceIntPtr AddInputDevice(DeviceProc deviceProc, Bool autoStart) { @@ -275,6 +277,13 @@ CloseDevice(register DeviceIntPtr dev) #endif free(l); } + +#ifdef XKB + XkbFreePrivates(dev); +#endif + + free(dev->devPrivates); + free(dev->sync.event); free(dev); } diff --git a/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c b/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c index 4952c0197..6fbc66481 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c @@ -1034,14 +1034,6 @@ Reply Total Cached Bits In Bits Out Bits/Reply Ratio fprintf(stderr, "nxagentKeyboardProc: Called for [DEVICE_CLOSE].\n"); #endif - for (int i = 0; i < pDev->nPrivates; i++) - { - free(pDev->devPrivates[i].ptr); - pDev->devPrivates[i].ptr = NULL; - } - free(pDev->devPrivates); - pDev->devPrivates = NULL; - break; } diff --git a/nx-X11/programs/Xserver/hw/nxagent/Pointer.c b/nx-X11/programs/Xserver/hw/nxagent/Pointer.c index 85d286b96..d344f34b0 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Pointer.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Pointer.c @@ -166,14 +166,6 @@ int nxagentPointerProc(DeviceIntPtr pDev, int onoff) fprintf(stderr, "nxagentPointerProc: Called for [DEVICE_CLOSE].\n"); #endif - for (int i = 0; i < pDev->nPrivates; i++) - { - free(pDev->devPrivates[i].ptr); - pDev->devPrivates[i].ptr = NULL; - } - free(pDev->devPrivates); - pDev->devPrivates = NULL; - break; } diff --git a/nx-X11/programs/Xserver/xkb/xkbActions.c b/nx-X11/programs/Xserver/xkb/xkbActions.c index 90bad93e0..a39e5c8f2 100644 --- a/nx-X11/programs/Xserver/xkb/xkbActions.c +++ b/nx-X11/programs/Xserver/xkb/xkbActions.c @@ -81,6 +81,20 @@ XkbSetExtension(DeviceIntPtr device, ProcessInputProc proc) proc,xkbUnwrapProc); } +void +XkbFreePrivates(DeviceIntPtr device) +{ + if (device && + device->devPrivates && + device->nPrivates > 0 && + xkbDevicePrivateIndex != -1 && + xkbDevicePrivateIndex < device->nPrivates) + { + free(device->devPrivates[xkbDevicePrivateIndex].ptr); + device->devPrivates[xkbDevicePrivateIndex].ptr = NULL; + } +} + #ifdef XINPUT extern void ProcessOtherEvent( xEvent * /* xE */, -- cgit v1.2.3