tablet: reject mislabelled tablet devices
authorPeter Hutterer <peter.hutterer@who-t.net>
Mon, 7 Mar 2016 00:12:13 +0000 (10:12 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Mon, 7 Mar 2016 03:05:26 +0000 (13:05 +1000)
The HUION 580 has a "consumer control" event node that has an ABS_VOLUME, keys
and a REL_HWHEEL. It has the same VID/PID as the pen tablet and libwacom
labels it as ID_INPUT_TABLET. This causes a crash later when we try to init
pointer acceleration for a device that doesn't have axes.

https://bugzilla.redhat.com/show_bug.cgi?id=1314955

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
src/evdev-tablet.c

index 0f6fa2cbc51eb35570235be997aa8a980dcb52c7..735988179c9ba6c2bad67b1d46080d5cd14df674 100644 (file)
@@ -1612,6 +1612,31 @@ tablet_init_left_handed(struct evdev_device *device)
 #endif
 }
 
+static int
+tablet_reject_device(struct evdev_device *device)
+{
+       struct libevdev *evdev = device->evdev;
+       int rc = -1;
+
+       if (!libevdev_has_event_code(evdev, EV_ABS, ABS_X) ||
+           !libevdev_has_event_code(evdev, EV_ABS, ABS_Y))
+               goto out;
+
+       if (!libevdev_has_event_code(evdev, EV_KEY, BTN_TOOL_PEN))
+               goto out;
+
+       rc = 0;
+
+out:
+       if (rc) {
+               log_bug_libinput(device->base.seat->libinput,
+                                "Device '%s' does not meet tablet criteria. "
+                                "Ignoring this device.\n",
+                                device->devname);
+       }
+       return rc;
+}
+
 static int
 tablet_init(struct tablet_dispatch *tablet,
            struct evdev_device *device)
@@ -1625,6 +1650,9 @@ tablet_init(struct tablet_dispatch *tablet,
        tablet->current_tool_type = LIBINPUT_TOOL_NONE;
        list_init(&tablet->tool_list);
 
+       if (tablet_reject_device(device))
+               return -1;
+
        tablet_init_calibration(tablet, device);
        tablet_init_proximity_threshold(tablet, device);
        rc = tablet_init_accel(tablet, device);