FAILED: patch "[PATCH] ALSA: usb-audio: Clamp implicit feedback packet count to URB" failed to apply to 6.18-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.18-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.18.y
git checkout FETCH_HEAD
git cherry-pick -x 76a986c980bb502c7688d605ac7a67fd257a9a1b
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026092245-renewably-elevate-ca0d@gregkh' --subject-prefix 'PATCH 6.18.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 76a986c980bb502c7688d605ac7a67fd257a9a1b Mon Sep 17 00:00:00 2001
From: Xiang Mei <[email protected]>
Date: Sat, 12 Sep 2026 13:05:30 -0700
Subject: [PATCH] ALSA: usb-audio: Clamp implicit feedback packet count to URB
capacity
data_ep_set_params() allocates each data URB for exactly u->packets isochronous frames, so urb->iso_frame_desc[] has u->packets slots and ctx->packets is the driver's only record of that limit. For an implicit feedback sink, snd_usb_queue_pending_output_urbs() overwrites it with the sync source's packet count, which is calculated independently from the capture endpoint's parameters. When that count is larger, prepare_playback_urb() and prepare_silent_urb() can write iso_frame_desc[] past the allocation; their existing bounds limit payload bytes, not the descriptor index.
The reproducer uses a high-speed UAC2 device declaring bInterval 1 for implicit feedback capture (8 packets) and bInterval 4 for playback (1 packet). On the first capture completion after the stream starts, it accesses seven descriptors spanning 112 bytes beyond the one-packet URB:
BUG: KASAN: slab-out-of-bounds in prepare_playback_urb (sound/usb/pcm.c:1560) Write of size 4 at addr ffff88801e696ad0 by task vhci_rx/178 prepare_playback_urb (sound/usb/pcm.c:1560) prepare_outbound_urb (sound/usb/endpoint.c:340) snd_usb_queue_pending_output_urbs (sound/usb/endpoint.c:501) snd_complete_urb (sound/usb/endpoint.c:1834) __usb_hcd_giveback_urb (drivers/usb/core/hcd.c:1657) usb_hcd_giveback_urb (drivers/usb/core/hcd.c:1741) vhci_rx_loop (drivers/usb/usbip/vhci_rx.c:107) kthread (kernel/kthread.c:436) The buggy address belongs to the object at ffff88801e696a00 which belongs to the cache kmalloc-256 of size 256 The buggy address is located 0 bytes to the right of allocated 208-byte region [ffff88801e696a00, ffff88801e696ad0)
Record the allocated packet count per endpoint and clamp both the adopted count and the packet-size copy to it. Fold the Format Type II delimiter into urb_packs before the allocation loop so the recorded limit matches every URB.
sound/usb/card.h +1 -0
@@ -116,6 +116,7 @@ struct snd_usb_endpoint {unsigned int phase;/* phase accumulator */ unsigned int maxpacksize;/* max packet size in bytes */ unsigned int maxframesize;/* max packet size in frames */ +unsigned int max_urb_packs;/* packets allocated per data URB */ unsigned int max_urb_frames;/* max URB size in frames */ unsigned int curpacksize;/* current packet size in bytes (for capture) */ unsigned int curframesize;/* current packet size in frames (for capture) */
sound/usb/endpoint.c +7 -5
@@ -492,9 +492,10 @@ int snd_usb_queue_pending_output_urbs(struct snd_usb_endpoint *ep,/* copy over the length information */ if (implicit_fb) { - ctx->packets = packet->packets; + ctx->packets =min_t (int, packet->packets, + ep->max_urb_packs);memcpy (ctx->packet_size, packet->packet_size, - packet->packets *sizeof (packet->packet_size[0 ])); + ctx->packets *sizeof (packet->packet_size[0 ])); }/* call the data handler to fill in playback data */
@@ -1242,15 +1243,16 @@ static int data_ep_set_params(struct snd_usb_endpoint *ep) ep->nurbs =min (max_urbs, urbs_per_period * ep->cur_buffer_periods); } +if (fmt->fmt_type ==UAC_FORMAT_TYPE_II ) + urb_packs++;/* for transfer delimiter */ + ep->max_urb_packs = urb_packs; +/* allocate and initialize data urbs */ for (i =0 ; i < ep->nurbs; i++) {struct snd_urb_ctx *u = &ep->urb[i]; u->index = i; u->ep = ep; u->packets = urb_packs; - -if (fmt->fmt_type ==UAC_FORMAT_TYPE_II ) - u->packets++;/* for transfer delimiter */ u->buffer_size = maxsize * u->packets; u->urb =usb_alloc_urb (u->packets,GFP_KERNEL );if (!u->urb)
Sasha Levin
maintainerPATCH 1/2 ALSA: usb-audio: Optimize the copy of packet sizes for implicit fb handling
From: Takashi Iwai <[email protected]>
[ Upstream commit 36adb51ac0b19edb32ffeea3fe66b174bad25ead ]
We did manual copies over loop for the packet data update of the implicit feedback, but this can be optimized with a simple memcpy().
Along with it, change the data type of snd_usb_packet_info struct to align with other (from uint32_t to int).
No functional changes but only code optimizations.
Stable-dep-of: 76a986c980bb ("ALSA: usb-audio: Clamp implicit feedback packet count to URB capacity")
--- sound/usb/card.h | 2 +- sound/usb/endpoint.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-)
sound/usb/card.h +1 -1
@@ -90,7 +90,7 @@ struct snd_usb_endpoint {struct snd_urb_ctx urb[MAX_URBS ];struct snd_usb_packet_info { -uint32_t packet_size[MAX_PACKS_HS ]; +int packet_size[MAX_PACKS_HS ];int packets; } next_packet[MAX_URBS ];unsigned int next_packet_head;/* ring buffer offset to read */
sound/usb/endpoint.c +3 -3
@@ -470,7 +470,7 @@ int snd_usb_queue_pending_output_urbs(struct snd_usb_endpoint *ep,while (ep_state_running (ep)) {struct snd_usb_packet_info *packet;struct snd_urb_ctx *ctx =NULL ; -int err, i; +int err; scoped_guard(spinlock_irqsave, &ep->lock) { if ((!implicit_fb || ep->next_packet_queued > 0) &&
@@ -490,8 +490,8 @@ int snd_usb_queue_pending_output_urbs(struct snd_usb_endpoint *ep,/* copy over the length information */ if (implicit_fb) { ctx->packets = packet->packets; -for (i =0 ; i < packet->packets; i++) - ctx->packet_size[i] = packet->packet_size[i]; +memcpy (ctx->packet_size, packet->packet_size, + packet->packets *sizeof (packet->packet_size[0 ])); }/* call the data handler to fill in playback data */
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 2/2 ALSA: usb-audio: Clamp implicit feedback packet count to URB capacity
From: Xiang Mei <[email protected]>
[ Upstream commit 76a986c980bb502c7688d605ac7a67fd257a9a1b ]
data_ep_set_params() allocates each data URB for exactly u->packets isochronous frames, so urb->iso_frame_desc[] has u->packets slots and ctx->packets is the driver's only record of that limit. For an implicit feedback sink, snd_usb_queue_pending_output_urbs() overwrites it with the sync source's packet count, which is calculated independently from the capture endpoint's parameters. When that count is larger, prepare_playback_urb() and prepare_silent_urb() can write iso_frame_desc[] past the allocation; their existing bounds limit payload bytes, not the descriptor index.
The reproducer uses a high-speed UAC2 device declaring bInterval 1 for implicit feedback capture (8 packets) and bInterval 4 for playback (1 packet). On the first capture completion after the stream starts, it accesses seven descriptors spanning 112 bytes beyond the one-packet URB:
BUG: KASAN: slab-out-of-bounds in prepare_playback_urb (sound/usb/pcm.c:1560) Write of size 4 at addr ffff88801e696ad0 by task vhci_rx/178 prepare_playback_urb (sound/usb/pcm.c:1560) prepare_outbound_urb (sound/usb/endpoint.c:340) snd_usb_queue_pending_output_urbs (sound/usb/endpoint.c:501) snd_complete_urb (sound/usb/endpoint.c:1834) __usb_hcd_giveback_urb (drivers/usb/core/hcd.c:1657) usb_hcd_giveback_urb (drivers/usb/core/hcd.c:1741) vhci_rx_loop (drivers/usb/usbip/vhci_rx.c:107) kthread (kernel/kthread.c:436) The buggy address belongs to the object at ffff88801e696a00 which belongs to the cache kmalloc-256 of size 256 The buggy address is located 0 bytes to the right of allocated 208-byte region [ffff88801e696a00, ffff88801e696ad0)
Record the allocated packet count per endpoint and clamp both the adopted count and the packet-size copy to it. Fold the Format Type II delimiter into urb_packs before the allocation loop so the recorded limit matches every URB.
--- sound/usb/card.h | 1 + sound/usb/endpoint.c | 12 +++++++----- 2 files changed, 8 insertions(+), 5 deletions(-)
sound/usb/card.h +1 -0
@@ -116,6 +116,7 @@ struct snd_usb_endpoint {unsigned int phase;/* phase accumulator */ unsigned int maxpacksize;/* max packet size in bytes */ unsigned int maxframesize;/* max packet size in frames */ +unsigned int max_urb_packs;/* packets allocated per data URB */ unsigned int max_urb_frames;/* max URB size in frames */ unsigned int curpacksize;/* current packet size in bytes (for capture) */ unsigned int curframesize;/* current packet size in frames (for capture) */
sound/usb/endpoint.c +7 -5
@@ -489,9 +489,10 @@ int snd_usb_queue_pending_output_urbs(struct snd_usb_endpoint *ep,/* copy over the length information */ if (implicit_fb) { - ctx->packets = packet->packets; + ctx->packets =min_t (int, packet->packets, + ep->max_urb_packs);memcpy (ctx->packet_size, packet->packet_size, - packet->packets *sizeof (packet->packet_size[0 ])); + ctx->packets *sizeof (packet->packet_size[0 ])); }/* call the data handler to fill in playback data */
@@ -1235,15 +1236,16 @@ static int data_ep_set_params(struct snd_usb_endpoint *ep) ep->nurbs =min (max_urbs, urbs_per_period * ep->cur_buffer_periods); } +if (fmt->fmt_type ==UAC_FORMAT_TYPE_II ) + urb_packs++;/* for transfer delimiter */ + ep->max_urb_packs = urb_packs; +/* allocate and initialize data urbs */ for (i =0 ; i < ep->nurbs; i++) {struct snd_urb_ctx *u = &ep->urb[i]; u->index = i; u->ep = ep; u->packets = urb_packs; - -if (fmt->fmt_type ==UAC_FORMAT_TYPE_II ) - u->packets++;/* for transfer delimiter */ u->buffer_size = maxsize * u->packets; u->urb =usb_alloc_urb (u->packets,GFP_KERNEL );if (!u->urb)
Signature · 1 line
2.53.0