Skip to content

Commit 5cdfabb

Browse files
CIQ Kernel Automationroxanan1996
authored andcommitted
ALSA: usb-audio: Fix potential overflow of PCM transfer buffer
jira VULN-161123 cve CVE-2025-40269 commit-author Takashi Iwai <tiwai@suse.de> commit 05a1fc5 The PCM stream data in USB-audio driver is transferred over USB URB packet buffers, and each packet size is determined dynamically. The packet sizes are limited by some factors such as wMaxPacketSize USB descriptor. OTOH, in the current code, the actually used packet sizes are determined only by the rate and the PPS, which may be bigger than the size limit above. This results in a buffer overflow, as reported by syzbot. Basically when the limit is smaller than the calculated packet size, it implies that something is wrong, most likely a weird USB descriptor. So the best option would be just to return an error at the parameter setup time before doing any further operations. This patch introduces such a sanity check, and returns -EINVAL when the packet size is greater than maxpacksize. The comparison with ep->packsize[1] alone should suffice since it's always equal or greater than ep->packsize[0]. Reported-by: syzbot+bfd77469c8966de076f7@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=bfd77469c8966de076f7 Link: https://lore.kernel.org/690b6b46.050a0220.3d0d33.0054.GAE@google.com Cc: Lizhi Xu <lizhi.xu@windriver.com> Cc: <stable@vger.kernel.org> Link: https://patch.msgid.link/20251109091211.12739-1-tiwai@suse.de Signed-off-by: Takashi Iwai <tiwai@suse.de> (cherry picked from commit 05a1fc5) Signed-off-by: CIQ Kernel Automation <ciq_kernel_automation@ciq.com>
1 parent b6a9444 commit 5cdfabb

1 file changed

Lines changed: 5 additions & 0 deletions

File tree

sound/usb/endpoint.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1284,6 +1284,11 @@ static int snd_usb_endpoint_set_params(struct snd_usb_audio *chip,
12841284
ep->sample_rem = ep->cur_rate % ep->pps;
12851285
ep->packsize[0] = ep->cur_rate / ep->pps;
12861286
ep->packsize[1] = (ep->cur_rate + (ep->pps - 1)) / ep->pps;
1287+
if (ep->packsize[1] > ep->maxpacksize) {
1288+
usb_audio_dbg(chip, "Too small maxpacksize %u for rate %u / pps %u\n",
1289+
ep->maxpacksize, ep->cur_rate, ep->pps);
1290+
return -EINVAL;
1291+
}
12871292

12881293
/* calculate the frequency in 16.16 format */
12891294
ep->freqm = ep->freqn;

0 commit comments

Comments
 (0)