evdev problems

Peter Hutterer mailinglists at who-t.net
Wed Mar 21 00:14:18 PDT 2007


On 20/03/2007, at 17:01 , Peter Hutterer wrote:
> I'm not sure what exactly goes wrong. If the ioctl wouldn't fail, I  
> suppose it should work. So why does it fail?

Problem occurs in master too.

With USB keyboards do the following:
1) Send a dbus command to X, evdev will get a ioctl IEVIOCGRAB on the  
device in EvdevNew. Unplug device.
2) Plug device in, evdev will automatically grab it, this time in  
EvdevProc, and also add it to the device list. Nevermind we didn't  
actually send the dbus commands to add it.
3) Send dbus command now. ioctl will fail as the device is already  
grabbed and we have the double-free error as described previously.

Closing the device when a read error occurs removes the problem of  
the double-grab. If a device is closed, it is removed from all  
internal lists. Next time a dbus command comes along it is re- 
initialised.

diff --git a/src/evdev.c b/src/evdev.c
index 1bcaef8..2ec04f1 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -93,7 +93,7 @@ EvdevReadInput(InputInfoPtr pInfo)
		    strerror(errno), errno, len, sizeof (ev));
	    if (len < 0) {
		evdevDevicePtr pEvdev = pInfo->private;
-		pEvdev->callback(pEvdev->pInfo->dev, DEVICE_OFF);
+		pEvdev->callback(pEvdev->pInfo->dev, DEVICE_CLOSE);
		pEvdev->seen--;
	    }
              break;

This is not a real fix, but I think we need to rewrite parts of evdev  
to fix it properly. This driver-internal hotplugging around the real  
hotplugging mechanism is not good.

Cheers,
   Peter

--
Multi-Pointer X Server
http://wearables.unisa.edu.au/mpx





More information about the xorg mailing list