* [PATCH v3] ALSA: usb-audio: Kill MIDI 2.0 URBs before freeing endpoints
@ 2026-06-18 17:00 Cen Zhang
2026-06-19 8:49 ` Takashi Iwai
0 siblings, 1 reply; 2+ messages in thread
From: Cen Zhang @ 2026-06-18 17:00 UTC (permalink / raw)
To: Jaroslav Kysela, Takashi Iwai
Cc: linux-sound, linux-kernel, baijiaju1990, zzzccc427
MIDI 2.0 input URBs are started during snd_usb_midi_v2_create(). A
later setup failure can still jump to snd_usb_midi_v2_free(), which
currently frees each endpoint and its coherent URB buffers without first
stopping the submitted URBs. A completion can then dereference the
embedded URB context and endpoint state after they have been freed, or
try to resubmit from the stale endpoint.
This was observed as a KASAN slab-use-after-free in
input_urb_complete().
The buggy scenario involves two paths, with each column showing the order
within that path:
probe error path: USB completion path:
1. start_input_streams() submits 1. The HCD still owns a
input URBs. submitted input URB.
2. A later setup helper returns 2. input_urb_complete() runs
an error. with urb->context in ep.
3. snd_usb_midi_v2_free() frees 3. The completion reads ep
endpoint storage and URB buffers. state and can requeue URBs.
Make the endpoint destructor follow the same teardown ordering used for
disconnect when the endpoint has not already been disconnected: publish
ep->disconnected, kill the URBs synchronously, and drain the endpoint
before freeing URB buffers and endpoint storage. The guard avoids
repeating the stop sequence after the normal
snd_usb_midi_v2_disconnect_all() path, while still synchronizing the
direct MIDI 2.0 create-error free path.
Validation reproduced this kernel report:
BUG: KASAN: slab-use-after-free in input_urb_complete+0x37/0x1b0
Workqueue: usb_hub_wq hub_event
RIP: 0010:_raw_spin_unlock_irq+0x2e/0x50
Read of size 8
Call trace:
dump_stack_lvl+0x77/0xb0
print_report+0xce/0x5f0
input_urb_complete+0x37/0x1b0 (sound/usb/midi2.c:186)
srso_alias_return_thunk+0x5/0xfbef5
__virt_addr_valid+0x19f/0x330
kasan_report+0xe0/0x110
__usb_hcd_giveback_urb+0x112/0x1d0
dummy_timer+0xaaa/0x19a0
lock_is_held_type+0x9a/0x110
__lock_acquire+0x467/0x28b0
mark_held_locks+0x40/0x70
_raw_spin_unlock_irqrestore+0x44/0x60
lockdep_hardirqs_on_prepare+0xbb/0x1a0
__hrtimer_run_queues+0x101/0x520
hrtimer_run_softirq+0xd0/0x130
handle_softirqs+0x15b/0x670
__irq_exit_rcu+0xd0/0x170
irq_exit_rcu+0xe/0x20
sysvec_apic_timer_interrupt+0x6c/0x80
asm_sysvec_apic_timer_interrupt+0x1a/0x20
Fixes: d9c99876868c ("ALSA: usb-audio: Create UMP blocks from USB MIDI GTBs")
Assisted-by: Codex:gpt-5.5
Signed-off-by: Cen Zhang <zzzccc427@gmail.com>
---
sound/usb/midi2.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/sound/usb/midi2.c b/sound/usb/midi2.c
index 04aeb9052f13..3ec633291772 100644
--- a/sound/usb/midi2.c
+++ b/sound/usb/midi2.c
@@ -470,6 +470,11 @@ static int create_midi2_endpoint(struct snd_usb_midi2_interface *umidi,
static void free_midi2_endpoint(struct snd_usb_midi2_endpoint *ep)
{
list_del(&ep->list);
+ if (!ep->disconnected) {
+ ep->disconnected = 1;
+ kill_midi_urbs(ep, false);
+ drain_urb_queue(ep);
+ }
free_midi_urbs(ep);
kfree(ep);
}
--
2.43.0
^ permalink raw reply related [flat|nested] 2+ messages in thread* Re: [PATCH v3] ALSA: usb-audio: Kill MIDI 2.0 URBs before freeing endpoints
2026-06-18 17:00 [PATCH v3] ALSA: usb-audio: Kill MIDI 2.0 URBs before freeing endpoints Cen Zhang
@ 2026-06-19 8:49 ` Takashi Iwai
0 siblings, 0 replies; 2+ messages in thread
From: Takashi Iwai @ 2026-06-19 8:49 UTC (permalink / raw)
To: Cen Zhang
Cc: Jaroslav Kysela, Takashi Iwai, linux-sound, linux-kernel,
baijiaju1990
On Thu, 18 Jun 2026 19:00:10 +0200,
Cen Zhang wrote:
>
> MIDI 2.0 input URBs are started during snd_usb_midi_v2_create(). A
> later setup failure can still jump to snd_usb_midi_v2_free(), which
> currently frees each endpoint and its coherent URB buffers without first
> stopping the submitted URBs. A completion can then dereference the
> embedded URB context and endpoint state after they have been freed, or
> try to resubmit from the stale endpoint.
>
> This was observed as a KASAN slab-use-after-free in
> input_urb_complete().
>
> The buggy scenario involves two paths, with each column showing the order
> within that path:
>
> probe error path: USB completion path:
> 1. start_input_streams() submits 1. The HCD still owns a
> input URBs. submitted input URB.
> 2. A later setup helper returns 2. input_urb_complete() runs
> an error. with urb->context in ep.
> 3. snd_usb_midi_v2_free() frees 3. The completion reads ep
> endpoint storage and URB buffers. state and can requeue URBs.
>
> Make the endpoint destructor follow the same teardown ordering used for
> disconnect when the endpoint has not already been disconnected: publish
> ep->disconnected, kill the URBs synchronously, and drain the endpoint
> before freeing URB buffers and endpoint storage. The guard avoids
> repeating the stop sequence after the normal
> snd_usb_midi_v2_disconnect_all() path, while still synchronizing the
> direct MIDI 2.0 create-error free path.
>
> Validation reproduced this kernel report:
> BUG: KASAN: slab-use-after-free in input_urb_complete+0x37/0x1b0
> Workqueue: usb_hub_wq hub_event
> RIP: 0010:_raw_spin_unlock_irq+0x2e/0x50
> Read of size 8
> Call trace:
> dump_stack_lvl+0x77/0xb0
> print_report+0xce/0x5f0
> input_urb_complete+0x37/0x1b0 (sound/usb/midi2.c:186)
> srso_alias_return_thunk+0x5/0xfbef5
> __virt_addr_valid+0x19f/0x330
> kasan_report+0xe0/0x110
> __usb_hcd_giveback_urb+0x112/0x1d0
> dummy_timer+0xaaa/0x19a0
> lock_is_held_type+0x9a/0x110
> __lock_acquire+0x467/0x28b0
> mark_held_locks+0x40/0x70
> _raw_spin_unlock_irqrestore+0x44/0x60
> lockdep_hardirqs_on_prepare+0xbb/0x1a0
> __hrtimer_run_queues+0x101/0x520
> hrtimer_run_softirq+0xd0/0x130
> handle_softirqs+0x15b/0x670
> __irq_exit_rcu+0xd0/0x170
> irq_exit_rcu+0xe/0x20
> sysvec_apic_timer_interrupt+0x6c/0x80
> asm_sysvec_apic_timer_interrupt+0x1a/0x20
>
> Fixes: d9c99876868c ("ALSA: usb-audio: Create UMP blocks from USB MIDI GTBs")
> Assisted-by: Codex:gpt-5.5
> Signed-off-by: Cen Zhang <zzzccc427@gmail.com>
Applied now. Thanks.
Takashi
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-06-19 8:49 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-18 17:00 [PATCH v3] ALSA: usb-audio: Kill MIDI 2.0 URBs before freeing endpoints Cen Zhang
2026-06-19 8:49 ` Takashi Iwai
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.