[PATCH v2] Allow driver to call DeleteInputDeviceRequest during UnInit

Peter Hutterer peter.hutterer at who-t.net
Sun Jan 17 19:34:56 PST 2010


On Fri, Jan 15, 2010 at 10:40:02AM +0100, Simon Thum wrote:
> Oldřich Jedlička wrote:
> > When the input driver (like xf86-input-wacom) removes it's devices
> > during a call to UnInit, the CloseDownDevices() cannot handle it. The
> > "next" variable can become a pointer to freed memory.
> > 
> > The patch introduces order-independent device freeing mechanism by
> > remembering the already freed device ids. The devices can reorder any
> > time during freeing. No device will be double-freed - if the removing
> > failed for any reason; some implementations of DeleteInputDeviceRequest
> > don't free the devices already.
> > 
> > Signed-off-by: Oldřich Jedlička <oldium.pro at seznam.cz>
> > ---
> >  dix/devices.c |   42 +++++++++++++++++++++++++++++++-----------
> >  1 files changed, 31 insertions(+), 11 deletions(-)
> > 
> > diff --git dix/devices.c dix/devices.c
> > index 245a95b..dce0f12 100644
> > --- dix/devices.c
> > +++ dix/devices.c
> > @@ -878,13 +878,41 @@ CloseDevice(DeviceIntPtr dev)
> >  }
> >  
> >  /**
> > + * Shut down all devices of one list and free all resources.
> > + */
> > +static
> > +void
> > +CloseListDevices(DeviceIntPtr *listHead)
> > +{
> > +    /* Used to mark devices that we tried to free */
> > +    Bool freedIds[MAXDEVICES] = { 0 };
> This would only work if UnInit()s removals are somehow forced onto
> freedIds. In any case the freed array is a sort of context that's not
> easy to get right. I'm CC'ing Peter, maybe he's got a better idea.

yes, you're right. this solution could work though if the ID array was
shared between CloseDevice and this function here. Any device calls
CloseDevice at some point, so this is the best point you can fill in the ID
array.

Cheers,
  Peter


More information about the xorg-devel mailing list