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 <[email protected]> > --- > 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 <[email protected]> Cheers, Peter _______________________________________________ xorg-devel mailing list [email protected] http://lists.x.org/mailman/listinfo/xorg-devel
