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
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.