CVE-2026-98859

Source
https://cve.org/CVERecord?id=CVE-2026-98859
Import Source
https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-98859.json
JSON Data
https://api.osv.dev/v1/vulns/CVE-2026-98859
Downstream
Published
2026-10-18T15:51:20Z
Modified
2026-10-19T02:46:05Z
Summary
HID: multitouch: stop the release timer from being rearmed on remove
Details

In the Linux kernel, the following vulnerability has been resolved:

HID: multitouch: stop the release timer from being rearmed on remove

mt_remove() quiesces the sticky-finger timer before stopping the hardware:

timer_delete_sync(&td->release_timer);

sysfs_remove_group(&hdev->dev.kobj, &mt_attribute_group);
hid_hw_stop(hdev);

timer_delete_sync() waits for a running callback and dequeues the timer, but it does not stop the timer from being armed again. The transport is still delivering reports at that point, and the report path rearms it:

if (app->quirks & MT_QUIRK_STICKY_FINGERS) {
    if (td->mt_io_flags & MT_IO_SLOTS_MASK)
        mod_timer(&td->release_timer,
                  jiffies + msecs_to_jiffies(100));

A report that arrives after timer_delete_sync() has returned therefore leaves the timer queued. td is allocated with devm_kzalloc() against hdev->dev, so it is freed when the driver is unbound, after mt_remove() returns. When the timer fires afterwards, mt_expired_timeout() dereferences the freed td:

struct mt_device *td = timer_container_of(td, t, release_timer);
struct hid_device *hdev = td->hdev;

if (test_and_set_bit_lock(MT_IO_FLAGS_RUNNING, &td->mt_io_flags))

Simply moving the teardown after hid_hw_stop() does not fix this on its own, because mt_expired_timeout() calls mt_release_contacts(), which walks hdev->inputs; the timer still has to be quiesced before hid_hw_stop() tears the input devices down.

Use timer_shutdown_sync() instead, which additionally makes any later mod_timer() a no-op, so neither ordering constraint has to be traded off against the other. This is the final-teardown pattern the function was introduced for, and hid-wiimote already uses it for the same reason.

Database specific
{
    "cna_assigner":  "Linux",
    "osv_generated_from":  "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/98xxx/CVE-2026-98859.json"
}
References

Affected packages

Git / git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

Affected ranges

Type
GIT
Repo
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
Events
Introduced
4f4001bc76fd1a138a501fbd3d68cce72cbf96ce
Fixed
1f1bd9a3117f082eb891c0986c4f0e04cd974c9a
Fixed
0c19a6c1d25fd5ed66d1f80dc6f6e56cc1f0a787
Fixed
a0125ca86e405b8a704e96157a6c10ca51087652
Fixed
5acb2dace582f061aab5e14c399ac9480315f44b

Database specific

source
"https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-98859.json"

Linux / Kernel

Package

Name
Kernel

Affected ranges

Type
ECOSYSTEM
Events
Introduced
4.13.0
Fixed
6.12.113
Type
ECOSYSTEM
Events
Introduced
6.13.0
Fixed
6.18.56
Type
ECOSYSTEM
Events
Introduced
6.19.0
Fixed
7.2.10

Database specific

source
"https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-98859.json"