PT-2026-64585 · Linux · Linux

CVE-2026-64364

·

Published

2026-07-25

·

Updated

2026-07-25

None

No severity ratings or metrics are available. When they are, we'll update the corresponding info on the page.
In the Linux kernel, the following vulnerability has been resolved:
HID: multitouch: fix out-of-bounds bit access on mt io flags
mt io flags is a single unsigned long, but mt process slot(), mt release pending palms() and mt release contacts() use it as a per-slot bitmap indexed by the slot number. That slot number is only bounded by td->maxcontacts, which is taken from the device's ContactCountMaximum feature report and can be up to 255, not by BITS PER LONG.
As a result, a multitouch device that advertises a large contact count makes set bit()/clear bit() operate past the mt io flags word and corrupt the adjacent members of struct mt device. The sticky-fingers release timer is the easiest way to reach this. mt release contacts() runs
for (i = 0; i < mt->num slots; i++)
	clear bit(i, &td->mt io flags);
with num slots == maxcontacts. For maxcontacts around 250 the loop clears the bits that overlap td->applications.next, zeroing that list head, and the list for each entry() that immediately follows then dereferences NULL. The kernel panics from timer (softirq) context. On a KASAN build this shows up as a general protection fault in mt release contacts() with a null-ptr-deref at offset 0x58, which is offsetof(struct mt application, num received).
The state is reachable from an untrusted USB or Bluetooth HID multitouch device; no local privileges are required.
Store the per-slot active state in a separately allocated bitmap sized for maxcontacts, the same pattern already used for pending palm slots, and keep only MT IO FLAGS RUNNING in mt io flags. The two "mt io flags & MT IO SLOTS MASK" arming checks become bitmap empty(td->active slots, td->maxcontacts).
Move MT IO FLAGS RUNNING back to bit 0. It was bumped to bit 32 by the same commit to leave the low byte for the slot bits; with the slot bits gone it fits in bit 0 again, which also keeps it within the unsigned long on 32-bit.
Found an issue in the description? Have something to add? Feel free to write us 👾

Related Identifiers

CVE-2026-64364

Affected Products

Linux