* [BUG] KASAN: slab-use-after-free in go7007_snd_hw_free
@ 2026-06-14 19:45 Shuangpeng Bai
2026-07-06 20:50 ` [PATCH] media: go7007: defer the ALSA v4l2 put until card release Shuangpeng Bai
0 siblings, 1 reply; 2+ messages in thread
From: Shuangpeng Bai @ 2026-06-14 19:45 UTC (permalink / raw)
To: hverkuil, mchehab, linux-media, linux-kernel
Hi Kernel Maintainers,
I hit the following report while testing current upstream kernel:
KASAN: slab-use-after-free in go7007_snd_hw_free
on commit: e8c2f9fdadee7cbc75134dc463c1e0d856d6e5c7 (May 25 2026)
The reproducer and .config files are here.
https://gist.github.com/shuangpengbai/88fca2a40cdcef309541cf4e9f6c1d5b
I'm happy to test debug patches or provide additional information.
Reported-by: Shuangpeng Bai <shuangpeng.kernel@gmail.com>
[ 136.245938][ T8273] BUG: KASAN: slab-use-after-free in go7007_snd_hw_free (drivers/media/usb/go7007/snd-go7007.c:111)
[ 136.247442][ T8273] Write of size 8 at addr ffff888108745090 by task repro_go7007_al/8273
[ 136.248893][ T8273]
[ 136.249399][ T8273] Hardware name: QEMU Ubuntu 24.04 PC v2 (i440FX + PIIX, arch_caps fix, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014
[ 136.249421][ T8273] Call Trace:
[ 136.249439][ T8273] <TASK>
[ 136.249444][ T8273] dump_stack_lvl (lib/dump_stack.c:94 lib/dump_stack.c:120)
[ 136.249571][ T8273] print_report (mm/kasan/report.c:378 mm/kasan/report.c:482)
[ 136.249689][ T8273] kasan_report (mm/kasan/report.c:595)
[ 136.249704][ T8273] go7007_snd_hw_free (drivers/media/usb/go7007/snd-go7007.c:111)
[ 136.249711][ T8273] snd_pcm_release_substream (sound/core/pcm_native.c:933 sound/core/pcm_native.c:2776)
[ 136.249773][ T8273] snd_pcm_release (sound/core/pcm_native.c:2965)
[ 136.249782][ T8273] __fput (fs/file_table.c:510)
[ 136.249806][ T8273] fput_close_sync (fs/file_table.c:615)
[ 136.249889][ T8273] __x64_sys_close (fs/open.c:1507 fs/open.c:1492 fs/open.c:1492)
[ 136.249912][ T8273] do_syscall_64 (arch/x86/entry/syscall_64.c:63 arch/x86/entry/syscall_64.c:94)
[ 136.249930][ T8273] entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:121)
[ 136.249974][ T8273] RIP: 0033:0x7ff69a1cfc03
[ 136.249990][ T8273] Code: e9 37 ff ff ff e8 2d f9 01 00 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 00 64 8b 04 25 18 00 00 00 85 c0 75 14 b8 03 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 45 c3 0f 1f 40 00 48 83 ec 18 89 7c 24 0c e8
[ 136.249997][ T8273] RSP: 002b:00007ffefc060c38 EFLAGS: 00000246 ORIG_RAX: 0000000000000003
[ 136.250036][ T8273] RAX: ffffffffffffffda RBX: 0000000000000009 RCX: 00007ff69a1cfc03
[ 136.250042][ T8273] RDX: 24abb4819636a0c4 RSI: 0000000000000000 RDI: 000000000000000b
[ 136.250046][ T8273] RBP: 0000000000000001 R08: 0000000000000009 R09: 0000000000000000
[ 136.250049][ T8273] R10: 0000000000000005 R11: 0000000000000246 R12: 0000000000000001
[ 136.250053][ T8273] R13: 000055e2002d7e60 R14: 00007ffefc060ce0 R15: 0000000000000000
[ 136.250085][ T8273] </TASK>
[ 136.250088][ T8273]
[ 136.264706][ T8273] Freed by task 776 on cpu 1 at 135.227504s:
[ 136.265113][ T8273] kasan_save_track (mm/kasan/common.c:57 mm/kasan/common.c:78)
[ 136.265447][ T8273] kasan_save_free_info (mm/kasan/generic.c:584)
[ 136.265801][ T8273] __kasan_slab_free (mm/kasan/common.c:253 mm/kasan/common.c:285)
[ 136.266132][ T8273] kfree (include/linux/kasan.h:235 mm/slub.c:2689 mm/slub.c:6251 mm/slub.c:6566)
[ 136.266414][ T8273] v4l2_device_put (drivers/media/v4l2-core/v4l2-device.c:51 include/linux/kref.h:65 drivers/media/v4l2-core/v4l2-device.c:56)
[ 136.266753][ T8273] usb_unbind_interface (drivers/usb/core/driver.c:458)
[ 136.267128][ T8273] device_release_driver_internal (drivers/base/dd.c:621 drivers/base/dd.c:1352 drivers/base/dd.c:1375)
[ 136.267579][ T8273] bus_remove_device (drivers/base/bus.c:657)
[ 136.267918][ T8273] device_del (drivers/base/core.c:3895)
[ 136.268214][ T8273] usb_disable_device (drivers/usb/core/message.c:1478)
[ 136.268577][ T8273] usb_disconnect (drivers/input/misc/yealink.c:421)
[ 136.268904][ T8273] hub_event (drivers/usb/core/hub.c:5407 drivers/usb/core/hub.c:5707 drivers/usb/core/hub.c:5871 drivers/usb/core/hub.c:5953)
[ 136.269209][ T8273] process_scheduled_works (kernel/workqueue.c:3314 kernel/workqueue.c:3397)
[ 136.269599][ T8273] worker_thread (kernel/workqueue.c:3478)
[ 136.269968][ T8273] kthread (kernel/kthread.c:436)
[ 136.270335][ T8273] ret_from_fork (kernel/process.c:158)
[ 136.270667][ T8273] ret_from_fork_asm (arch/x86/entry/entry_64.S:245)
[ 136.270993][ T8273]
[ 136.271155][ T8273] The buggy address belongs to the object at ffff888108744000
[ 136.271155][ T8273] which belongs to the cache kmalloc-8k of size 8192
[ 136.272231][ T8273] The buggy address is located 4240 bytes inside of
[ 136.272231][ T8273] freed 8192-byte region [ffff888108744000, ffff888108746000)
[ 136.273166][ T8273]
Best,
Shuangpeng
^ permalink raw reply [flat|nested] 2+ messages in thread
* [PATCH] media: go7007: defer the ALSA v4l2 put until card release
2026-06-14 19:45 [BUG] KASAN: slab-use-after-free in go7007_snd_hw_free Shuangpeng Bai
@ 2026-07-06 20:50 ` Shuangpeng Bai
0 siblings, 0 replies; 2+ messages in thread
From: Shuangpeng Bai @ 2026-07-06 20:50 UTC (permalink / raw)
To: hverkuil; +Cc: mchehab, linux-media, linux-kernel, Shuangpeng Bai
go7007_snd_init() already takes a v4l2_device reference for the ALSA
side, but go7007_snd_remove() drops it immediately after calling
snd_card_free_when_closed().
That is too early when a userspace process still has the capture PCM open.
The ALSA card and its PCM callbacks remain alive until the last file is
closed, so the release path can still reach struct go7007 through
pcm->private_data and call go7007_snd_hw_free() after the V4L2 release path
has freed the object.
Move the matching v4l2_device_put() to the ALSA card private_free callback
so the existing ALSA reference covers the whole deferred card lifetime.
Closes: https://lore.kernel.org/r/178144969601.60470.6005237146425573205@gmail.com
Fixes: d5d3a7cc127d ("[media] go7007: fix unregister/disconnect handling")
Signed-off-by: Shuangpeng Bai <shuangpeng.kernel@gmail.com>
---
drivers/media/usb/go7007/snd-go7007.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/drivers/media/usb/go7007/snd-go7007.c b/drivers/media/usb/go7007/snd-go7007.c
index e4b9f37be77b..01d547ad678d 100644
--- a/drivers/media/usb/go7007/snd-go7007.c
+++ b/drivers/media/usb/go7007/snd-go7007.c
@@ -195,6 +195,13 @@ static const struct snd_device_ops go7007_snd_device_ops = {
.dev_free = go7007_snd_free,
};
+static void go7007_snd_card_free(struct snd_card *card)
+{
+ struct go7007 *go = card->private_data;
+
+ v4l2_device_put(&go->v4l2_dev);
+}
+
int go7007_snd_init(struct go7007 *go)
{
static int dev;
@@ -245,6 +252,8 @@ int go7007_snd_init(struct go7007 *go)
gosnd->substream = NULL;
go->snd_context = gosnd;
v4l2_device_get(&go->v4l2_dev);
+ gosnd->card->private_data = go;
+ gosnd->card->private_free = go7007_snd_card_free;
++dev;
return 0;
@@ -263,7 +272,6 @@ int go7007_snd_remove(struct go7007 *go)
snd_card_disconnect(gosnd->card);
snd_card_free_when_closed(gosnd->card);
- v4l2_device_put(&go->v4l2_dev);
return 0;
}
EXPORT_SYMBOL(go7007_snd_remove);
--
2.43.0
^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-07-06 20:50 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-14 19:45 [BUG] KASAN: slab-use-after-free in go7007_snd_hw_free Shuangpeng Bai
2026-07-06 20:50 ` [PATCH] media: go7007: defer the ALSA v4l2 put until card release Shuangpeng Bai
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox