CloseDevice: call XkbRemoveResourceClient before freeing key class struct
XkbRemoveResourceClient() returns immediately if dev->key is NULL.
CloseDevice calls XkbRemoveResourceClient until it removes all resources.
If we free dev->key and NULL it before XkbRemoveResourceClient, then
infinite loop ensues, and the server appears to hang on exit or crash.
Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Daniel Stone <daniel@fooishbar.org>
Signed-off-by: Keith Packard <keithp@keithp.com>
(cherry picked from commit 13c8bd3fde
)
This commit is contained in:
parent
d1320f4f29
commit
8661189c2c
|
@ -843,6 +843,9 @@ CloseDevice(DeviceIntPtr dev)
|
|||
if(dev->valuator && dev->valuator->accelScheme.AccelCleanupProc)
|
||||
dev->valuator->accelScheme.AccelCleanupProc(dev);
|
||||
|
||||
while (dev->xkb_interest)
|
||||
XkbRemoveResourceClient((DevicePtr)dev,dev->xkb_interest->resource);
|
||||
|
||||
xfree(dev->name);
|
||||
|
||||
classes = (ClassesPtr)&dev->key;
|
||||
|
@ -854,9 +857,6 @@ CloseDevice(DeviceIntPtr dev)
|
|||
FreeAllDeviceClasses(classes);
|
||||
}
|
||||
|
||||
while (dev->xkb_interest)
|
||||
XkbRemoveResourceClient((DevicePtr)dev,dev->xkb_interest->resource);
|
||||
|
||||
if (DevHasCursor(dev) && dev->spriteInfo->sprite) {
|
||||
xfree(dev->spriteInfo->sprite->spriteTrace);
|
||||
xfree(dev->spriteInfo->sprite);
|
||||
|
|
Loading…
Reference in New Issue
Block a user