CVE-2026-46146
Description
In the Linux kernel, the following vulnerability has been resolved:
ALSA: usb-audio: Avoid potential endless loop in convert_chmap_v3()
The convert_chmap_v3() has a loop with its increment size of cs_desc->wLength, but we forgot to validate cs_desc->wLength itself, which may lead to potential endless loop by a malformed descriptor.
Add a proper size check to abort the loop for plugging the hole.
AI Insight
LLM-synthesized narrative grounded in this CVE's description and references.
Missing descriptor length validation in Linux kernel's ALSA USB audio driver leads to potential infinite loop in convert_chmap_v3().
Vulnerability
In the Linux kernel's ALSA USB audio driver, the convert_chmap_v3() function iterates over a channel map descriptor using cs_desc->wLength as the increment size, but lacks validation of wLength itself. A malformed USB audio descriptor with an overly large or zero wLength can cause an infinite loop, leading to a denial of service. The issue affects kernel versions prior to the patch commit be09b47ed867 [1].
Exploitation
An attacker with physical access or the ability to plug a malicious USB device into the system can exploit this vulnerability. By providing a crafted USB audio descriptor with an invalid wLength, the kernel may loop indefinitely in convert_chmap_v3(), consuming CPU resources and potentially causing a system hang. No authentication or special privileges are required beyond the ability to connect a USB device.
Impact
A successful exploit causes a denial of service due to an infinite loop in the kernel, leading to a system hang or unresponsiveness. The attack does not allow code execution or privilege escalation; the impact is limited to availability (A) of the affected system.
Mitigation
The vulnerability is fixed in the Linux kernel by commit be09b47ed867 ("ALSA: usb-audio: Avoid potential endless loop in convert_chmap_v3()") [1]. Users should update their kernel to a version containing this fix. As a workaround, disable the loading of the snd-usb-audio module or restrict USB device access if the fix cannot be applied immediately. No CVE listing in KEV has been reported.
AI Insight generated on May 28, 2026. Synthesized from this CVE's description and the cited reference URLs; citations are validated against the source bundle.
Affected products
1Patches
10fa5b19ce6906ALSA: usb-audio: Avoid potential endless loop in convert_chmap_v3()
1 file changed · +2 −1
sound/usb/stream.c+2 −1 modifieddiff --git a/sound/usb/stream.c b/sound/usb/stream.c index d38c39e28f38fa..7e175eabca3a62 100644 --- a/sound/usb/stream.c +++ b/sound/usb/stream.c @@ -352,6 +352,8 @@ snd_pcm_chmap_elem *convert_chmap_v3(struct uac3_cluster_header_descriptor if (len < sizeof(*cs_desc)) break; cs_len = le16_to_cpu(cs_desc->wLength); + if (cs_len < sizeof(*cs_desc)) + break; if (len < cs_len) break; cs_type = cs_desc->bSegmentType; -- cgit 1.3-korg
e0e3dcf48189ALSA: usb-audio: Avoid potential endless loop in convert_chmap_v3()
1 file changed · +2 −1
sound/usb/stream.c+2 −1 modifieddiff --git a/sound/usb/stream.c b/sound/usb/stream.c index 12a5e053ec54fc..54b5f496eeae9e 100644 --- a/sound/usb/stream.c +++ b/sound/usb/stream.c @@ -352,6 +352,8 @@ snd_pcm_chmap_elem *convert_chmap_v3(struct uac3_cluster_header_descriptor if (len < sizeof(*cs_desc)) break; cs_len = le16_to_cpu(cs_desc->wLength); + if (cs_len < sizeof(*cs_desc)) + break; if (len < cs_len) break; cs_type = cs_desc->bSegmentType; -- cgit 1.3-korg
6e7247d8f5feALSA: usb-audio: Avoid potential endless loop in convert_chmap_v3()
1 file changed · +2 −1
sound/usb/stream.c+2 −1 modifieddiff --git a/sound/usb/stream.c b/sound/usb/stream.c index f8f56ace565235..b2c5c8198281ad 100644 --- a/sound/usb/stream.c +++ b/sound/usb/stream.c @@ -353,6 +353,8 @@ snd_pcm_chmap_elem *convert_chmap_v3(struct uac3_cluster_header_descriptor if (len < sizeof(*cs_desc)) break; cs_len = le16_to_cpu(cs_desc->wLength); + if (cs_len < sizeof(*cs_desc)) + break; if (len < cs_len) break; cs_type = cs_desc->bSegmentType; -- cgit 1.3-korg
4e0ee232ebe3ALSA: usb-audio: Avoid potential endless loop in convert_chmap_v3()
1 file changed · +2 −1
sound/usb/stream.c+2 −1 modifieddiff --git a/sound/usb/stream.c b/sound/usb/stream.c index db2c9bac00adca..fa6911a0dfb16b 100644 --- a/sound/usb/stream.c +++ b/sound/usb/stream.c @@ -352,6 +352,8 @@ snd_pcm_chmap_elem *convert_chmap_v3(struct uac3_cluster_header_descriptor if (len < sizeof(*cs_desc)) break; cs_len = le16_to_cpu(cs_desc->wLength); + if (cs_len < sizeof(*cs_desc)) + break; if (len < cs_len) break; cs_type = cs_desc->bSegmentType; -- cgit 1.3-korg
be09b47ed867ALSA: usb-audio: Avoid potential endless loop in convert_chmap_v3()
1 file changed · +2 −1
sound/usb/stream.c+2 −1 modifieddiff --git a/sound/usb/stream.c b/sound/usb/stream.c index 3b2526964e4b47..30523da73ec5ef 100644 --- a/sound/usb/stream.c +++ b/sound/usb/stream.c @@ -352,6 +352,8 @@ snd_pcm_chmap_elem *convert_chmap_v3(struct uac3_cluster_header_descriptor if (len < sizeof(*cs_desc)) break; cs_len = le16_to_cpu(cs_desc->wLength); + if (cs_len < sizeof(*cs_desc)) + break; if (len < cs_len) break; cs_type = cs_desc->bSegmentType; -- cgit 1.3-korg
fa5b19ce6906ALSA: usb-audio: Avoid potential endless loop in convert_chmap_v3()
1 file changed · +2 −1
sound/usb/stream.c+2 −1 modifieddiff --git a/sound/usb/stream.c b/sound/usb/stream.c index d38c39e28f38fa..7e175eabca3a62 100644 --- a/sound/usb/stream.c +++ b/sound/usb/stream.c @@ -352,6 +352,8 @@ snd_pcm_chmap_elem *convert_chmap_v3(struct uac3_cluster_header_descriptor if (len < sizeof(*cs_desc)) break; cs_len = le16_to_cpu(cs_desc->wLength); + if (cs_len < sizeof(*cs_desc)) + break; if (len < cs_len) break; cs_type = cs_desc->bSegmentType; -- cgit 1.3-korg
e0e3dcf48189ALSA: usb-audio: Avoid potential endless loop in convert_chmap_v3()
1 file changed · +2 −1
sound/usb/stream.c+2 −1 modifieddiff --git a/sound/usb/stream.c b/sound/usb/stream.c index 12a5e053ec54fc..54b5f496eeae9e 100644 --- a/sound/usb/stream.c +++ b/sound/usb/stream.c @@ -352,6 +352,8 @@ snd_pcm_chmap_elem *convert_chmap_v3(struct uac3_cluster_header_descriptor if (len < sizeof(*cs_desc)) break; cs_len = le16_to_cpu(cs_desc->wLength); + if (cs_len < sizeof(*cs_desc)) + break; if (len < cs_len) break; cs_type = cs_desc->bSegmentType; -- cgit 1.3-korg
6e7247d8f5feALSA: usb-audio: Avoid potential endless loop in convert_chmap_v3()
1 file changed · +2 −1
sound/usb/stream.c+2 −1 modifieddiff --git a/sound/usb/stream.c b/sound/usb/stream.c index f8f56ace565235..b2c5c8198281ad 100644 --- a/sound/usb/stream.c +++ b/sound/usb/stream.c @@ -353,6 +353,8 @@ snd_pcm_chmap_elem *convert_chmap_v3(struct uac3_cluster_header_descriptor if (len < sizeof(*cs_desc)) break; cs_len = le16_to_cpu(cs_desc->wLength); + if (cs_len < sizeof(*cs_desc)) + break; if (len < cs_len) break; cs_type = cs_desc->bSegmentType; -- cgit 1.3-korg
4e0ee232ebe3ALSA: usb-audio: Avoid potential endless loop in convert_chmap_v3()
1 file changed · +2 −1
sound/usb/stream.c+2 −1 modifieddiff --git a/sound/usb/stream.c b/sound/usb/stream.c index db2c9bac00adca..fa6911a0dfb16b 100644 --- a/sound/usb/stream.c +++ b/sound/usb/stream.c @@ -352,6 +352,8 @@ snd_pcm_chmap_elem *convert_chmap_v3(struct uac3_cluster_header_descriptor if (len < sizeof(*cs_desc)) break; cs_len = le16_to_cpu(cs_desc->wLength); + if (cs_len < sizeof(*cs_desc)) + break; if (len < cs_len) break; cs_type = cs_desc->bSegmentType; -- cgit 1.3-korg
be09b47ed867ALSA: usb-audio: Avoid potential endless loop in convert_chmap_v3()
1 file changed · +2 −1
sound/usb/stream.c+2 −1 modifieddiff --git a/sound/usb/stream.c b/sound/usb/stream.c index 3b2526964e4b47..30523da73ec5ef 100644 --- a/sound/usb/stream.c +++ b/sound/usb/stream.c @@ -352,6 +352,8 @@ snd_pcm_chmap_elem *convert_chmap_v3(struct uac3_cluster_header_descriptor if (len < sizeof(*cs_desc)) break; cs_len = le16_to_cpu(cs_desc->wLength); + if (cs_len < sizeof(*cs_desc)) + break; if (len < cs_len) break; cs_type = cs_desc->bSegmentType; -- cgit 1.3-korg
Vulnerability mechanics
Root cause
"Missing validation of the wLength field in UAC3 cluster segment descriptors allows a malformed descriptor to cause an infinite loop in convert_chmap_v3()."
Attack vector
An attacker with physical access or the ability to supply a malicious USB audio device can craft a UAC3 cluster descriptor with a `wLength` field smaller than the descriptor header size. When the kernel parses this descriptor in `convert_chmap_v3()`, the loop increments by the attacker-controlled `wLength` value; if `wLength` is zero or smaller than the header, the loop may never advance past the same descriptor, causing an endless loop and a denial of service (soft lockup). No authentication or special privileges are required beyond the ability to connect the malicious USB device.
Affected code
The vulnerable function is `convert_chmap_v3()` in `sound/usb/stream.c` [patch_id=2898301]. The loop iterates through UAC3 cluster segment descriptors using `cs_desc->wLength` as the increment, but lacked a validation that `wLength` is at least as large as the descriptor header size (`sizeof(*cs_desc)`).
What the fix does
The patch adds a single check after reading `cs_len = le16_to_cpu(cs_desc->wLength)`: if `cs_len < sizeof(*cs_desc)`, the loop breaks immediately [patch_id=2898301]. This ensures that a descriptor whose declared length is smaller than the mandatory header size is treated as invalid, preventing the loop from using that value as an increment and thus avoiding an infinite loop. The fix is minimal and targeted, closing the validation gap left by the earlier commit ecfd41166b72.
Preconditions
- inputAttacker must supply a malicious USB audio device (or modify USB descriptor data) that presents a UAC3 cluster segment descriptor with wLength smaller than sizeof(struct uac3_cluster_header_descriptor).
- configThe kernel must have CONFIG_SND_USB_AUDIO enabled and the device must be enumerated as a USB audio class 3 device.
Generated on May 28, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.
References
5- git.kernel.org/stable/c/4e0ee232ebe3df04874125d7c7f3e6c25ea5483dnvd
- git.kernel.org/stable/c/6e7247d8f5fefeceb0bb9cc80a5388a636b219cdnvd
- git.kernel.org/stable/c/be09b47ed8677d76962e3240c145502e2ad9f3c8nvd
- git.kernel.org/stable/c/e0e3dcf48189603f3865f1a0b799b3b42baae96dnvd
- git.kernel.org/stable/c/fa5b19ce69067874b1413f3c2027563bae8c2cb3nvd
News mentions
0No linked articles in our index yet.