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>
This commit is contained in:
parent
e707612e9d
commit
13c8bd3fde
|
@ -842,6 +842,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;
|
||||
|
@ -853,9 +856,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