diff options
| author | Nguyen Ngoc Thang <ngocthang2710.1999@gmail.com> | 2026-09-15 23:31:10 +0700 |
|---|---|---|
| committer | Takashi Iwai <tiwai@suse.de> | 2026-09-16 09:30:17 +0200 |
| commit | dbd9d1cbf9700528c8595ab1fa7ef832e79821fe (patch) | |
| tree | 1ad52517857e32af01527bc26f435574dd484450 /scripts/basic | |
| parent | c9e6e5f38bf75276605f1952b22285f5f3abcaff (diff) | |
| download | linux-dbd9d1cbf9700528c8595ab1fa7ef832e79821fe.tar.gz linux-dbd9d1cbf9700528c8595ab1fa7ef832e79821fe.zip | |
ALSA: usb-audio: fix list_add double-add in push_back_to_ready_list
stop_urbs() clears ep->ready_playback_urbs with a bare INIT_LIST_HEAD()
instead of unlinking each queued snd_urb_ctx. If a URB survives past
wait_clear_urbs()'s forced STOPPING->STOPPED timeout, its ctx is left
looking "linked" (stale next/prev) even though the list head has
forgotten it. When the endpoint later restarts and re-queues that same
ctx onto the (now real) ready list, and the old URB's completion
handler then calls push_back_to_ready_list() for it a second time, the
ctx is still the list's own tail and list_add's double-add check trips:
kernel BUG at lib/list_debug.c:35 (list_add double add)
Guard push_back_to_ready_list() with a list_empty() check so a
still-linked ctx isn't re-added, and make stop_urbs() actually unlink
each ctx via list_del_init() instead of only resetting the head, so a
dropped ctx doesn't keep looking linked to that guard.
Reported-by: syzbot+9fe3b8d9f5c64ff410a7@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=9fe3b8d9f5c64ff410a7
Signed-off-by: Nguyen Ngoc Thang <ngocthang2710.1999@gmail.com>
Link: https://patch.msgid.link/20260915163110.58124-1-ngocthang2710.1999@gmail.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'scripts/basic')
0 files changed, 0 insertions, 0 deletions
