[PATCH libinput] tablet: reject mislabelled tablet devices
Peter Hutterer
peter.hutterer at who-t.net
Mon Mar 7 05:01:28 UTC 2016
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 at who-t.net>
---
This is only one half of the fix, the other half should go into libwacom to
not label this device as tablet to begin with. Still, not crashing on
mislabeled devices seems like a feature.
src/evdev-tablet.c | 28 ++++++++++++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git a/src/evdev-tablet.c b/src/evdev-tablet.c
index 0f6fa2c..9fc38aa 100644
--- a/src/evdev-tablet.c
+++ b/src/evdev-tablet.c
@@ -1613,6 +1613,31 @@ tablet_init_left_handed(struct evdev_device *device)
}
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, 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);
--
2.5.0
More information about the wayland-devel
mailing list