[PATCH] CloseDevice: call XkbRemoveResourceClient before freeing key class struct
Peter Hutterer
peter.hutterer at who-t.net
Mon Jan 4 14:11:00 PST 2010
On Mon, Jan 04, 2010 at 11:40:16AM -0800, Alan Coopersmith wrote:
> 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 at sun.com>
> ---
> dix/devices.c | 6 +++---
> 1 files changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/dix/devices.c b/dix/devices.c
> index 6329d28..92b95ed 100644
> --- a/dix/devices.c
> +++ b/dix/devices.c
> @@ -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);
> --
> 1.5.6.5
Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>
Cheers,
Peter
More information about the xorg-devel
mailing list