CVE-2026-80575: Input: cs40l50-vibra - validate custom data from user space
In the Linux kernel, the following vulnerability has been resolved:
Input: cs40l50-vibra - validate custom data from user space
cs40l50add() copies the custom data of an FFPERIODIC/FFCUSTOM effect straight from the ffeffect the user passed to EVIOCSFF, without requiring it to hold anything:
workdata.customdata = memduparrayuser(periodic->customdata, periodic->customlen, sizeof(s16)); workdata.customlen = periodic->customlen;
The driver then reads two words out of that buffer: customdata[0] as the waveform bank in cs40l50effectbankset(), and customdata[1] as the index within the bank in cs40l50effectindexset(). Neither read is covered by a length check, and customlen is fully user controlled:
- customlen == 0 makes memduparrayuser() call memdupuser() with a length of zero, which returns ZEROSIZEPTR rather than an error, so customdata[0] dereferences it.
- customlen == 1 allocates two bytes. A bank of ROM or RAM keeps effect->type out of the OWT case, and customdata[1] is then read one word past the allocation.
The bank value itself is also mishandled. It is masked with CS40L50CUSTOMDATAMASK (0xffff) but stored in an s16, so a customdata[0] of 0x8000 or above wraps to a negative value that passes the "banktype >= CS40L50WVFRMBANKNUM" test. cs40l50effectindexset() indexes vib->dsp.banks[] with it before the switch statement's default case gets a chance to reject it:
baseindex = vib->dsp.banks[effect->type].baseindex; maxindex = vib->dsp.banks[effect->type].maxindex;
Require the two words the driver reads to be present, and hold the masked bank in a u32 so the existing upper-bound test covers the whole range. The da7280 haptic driver already range checks customlen this way.
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
ubuntu/linux-hwe-7.0to a version that resolves this vulnerability.Fixed in 7.0.0-42.42~24.04.1 - Upgrade
Upgrade
ubuntu/linux-riscv-7.0to a version that resolves this vulnerability.Fixed in 7.0.0-42.42.1~24.04.1 - Upgrade
Upgrade
ubuntu/linuxto a version that resolves this vulnerability.Fixed in 7.0.0-42.42 - Upgrade
Upgrade
ubuntu/linux-awsto a version that resolves this vulnerability.Fixed in 7.0.0-1016.17 - Upgrade
Upgrade
ubuntu/linux-gcpto a version that resolves this vulnerability.Fixed in 7.0.0-1016.18 - Upgrade
Upgrade
ubuntu/linux-ibmto a version that resolves this vulnerability.Fixed in 7.0.0-1017.17 - Upgrade
Upgrade
ubuntu/linux-oem-7.0to a version that resolves this vulnerability.Fixed in 7.0.0-1017.17 - Upgrade
Upgrade
ubuntu/linux-oracleto a version that resolves this vulnerability.Fixed in 7.0.0-1015.16 - Upgrade
Upgrade
ubuntu/linux-riscvto a version that resolves this vulnerability.Fixed in 7.0.0-42.42.1 - Compensating control
In the cs40l50-vibra driver, require custom_len to provide both words read from custom_data before accessing custom_data[0] and custom_data[1], and store the masked bank value in a u32 so the existing upper-bound check covers the full range.
Event History
Frequently Asked Questions
Who is exposed to this issue?
Systems using the Linux kernel cs40l50-vibra input driver are exposed when user space can submit FF_PERIODIC effects with FF_CUSTOM data through EVIOCSFF. The affected data originates from the user-supplied ff_effect structure.
What inputs trigger the unsafe accesses?
A custom_len of 0 can cause the driver to dereference custom_data[0] from a zero-size allocation. A custom_len of 1 can cause the driver to read custom_data[1] one s16 word past the two-byte allocation for ROM or RAM banks.