Getting an out of range ABS_MT_SLOT value means that either the kernel driver is broken or the device is sending more slots that it advertised. In both cases, it's a bug in the kernel and processing the incoming events for this bad slot may introduce end-user problems.
Signed-off-by: Benjamin Tissoires <[email protected]> --- src/evdev.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/evdev.c b/src/evdev.c index 9930f4e..1dccd34 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -798,29 +798,28 @@ EvdevProcessTouchEvent(InputInfoPtr pInfo, struct input_event *ev) } else { int slot_index = last_mt_vals_slot(pEvdev); + if (slot_index < 0) { + if (ev->code == ABS_MT_TRACKING_ID && ev->value >= 0) + LogMessageVerbSigSafe(X_WARNING, 0, + "%s: Attempted to use values from out-of-range " + "slot, touch events discarded.\n", + pInfo->name); + return; + } if (pEvdev->slot_state == SLOTSTATE_EMPTY) pEvdev->slot_state = SLOTSTATE_UPDATE; if (ev->code == ABS_MT_TRACKING_ID) { if (ev->value >= 0) { pEvdev->slot_state = SLOTSTATE_OPEN; - - if (slot_index >= 0) - valuator_mask_copy(pEvdev->mt_mask, - pEvdev->last_mt_vals[slot_index]); - else - LogMessageVerbSigSafe(X_WARNING, 0, - "%s: Attempted to copy values from out-of-range " - "slot, touch events may be incorrect.\n", - pInfo->name); + valuator_mask_copy(pEvdev->mt_mask, + pEvdev->last_mt_vals[slot_index]); } else pEvdev->slot_state = SLOTSTATE_CLOSE; } else { map = pEvdev->axis_map[ev->code]; valuator_mask_set(pEvdev->mt_mask, map, ev->value); - if (slot_index >= 0) - valuator_mask_set(pEvdev->last_mt_vals[slot_index], map, - ev->value); + valuator_mask_set(pEvdev->last_mt_vals[slot_index], map, ev->value); } } } -- 1.8.0.2 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
