On Sun Dec 29 18:50:39 2024 +0800, Edward Adam Davis wrote: > syzbot report a null-ptr-deref in vidtv_mux_stop_thread. [1] > > If dvb->mux is not initialized successfully by vidtv_mux_init() in the > vidtv_start_streaming(), it will trigger null pointer dereference about mux > in vidtv_mux_stop_thread(). > > Adjust the timing of streaming initialization and check it before > stopping it. > > [1] > KASAN: null-ptr-deref in range [0x0000000000000128-0x000000000000012f] > CPU: 0 UID: 0 PID: 5842 Comm: syz-executor248 Not tainted > 6.13.0-rc4-syzkaller-00012-g9b2ffa6148b1 #0 > Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS > Google 09/13/2024 > RIP: 0010:vidtv_mux_stop_thread+0x26/0x80 > drivers/media/test-drivers/vidtv/vidtv_mux.c:471 > Code: 90 90 90 90 66 0f 1f 00 55 53 48 89 fb e8 82 2e c8 f9 48 8d bb 28 01 00 > 00 48 b8 00 00 00 00 00 fc ff df 48 89 fa 48 c1 ea 03 <0f> b6 04 02 84 c0 74 > 02 7e 3b 0f b6 ab 28 01 00 00 31 ff 89 ee e8 > RSP: 0018:ffffc90003f2faa8 EFLAGS: 00010202 > RAX: dffffc0000000000 RBX: 0000000000000000 RCX: ffffffff87cfb125 > RDX: 0000000000000025 RSI: ffffffff87d120ce RDI: 0000000000000128 > RBP: ffff888029b8d220 R08: 0000000000000005 R09: 0000000000000000 > R10: 0000000000000000 R11: 0000000000000003 R12: ffff888029b8d188 > R13: ffffffff8f590aa0 R14: ffffc9000581c5c8 R15: ffff888029a17710 > FS: 00007f7eef5156c0(0000) GS:ffff8880b8600000(0000) knlGS:0000000000000000 > CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 > CR2: 00007f7eef5e635c CR3: 0000000076ca6000 CR4: 00000000003526f0 > DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 > DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 > Call Trace: > <TASK> > vidtv_stop_streaming drivers/media/test-drivers/vidtv/vidtv_bridge.c:209 > [inline] > vidtv_stop_feed+0x151/0x250 > drivers/media/test-drivers/vidtv/vidtv_bridge.c:252 > dmx_section_feed_stop_filtering+0x90/0x160 > drivers/media/dvb-core/dvb_demux.c:1000 > dvb_dmxdev_feed_stop.isra.0+0x1ee/0x270 drivers/media/dvb-core/dmxdev.c:486 > dvb_dmxdev_filter_stop+0x22a/0x3a0 drivers/media/dvb-core/dmxdev.c:559 > dvb_dmxdev_filter_free drivers/media/dvb-core/dmxdev.c:840 [inline] > dvb_demux_release+0x92/0x550 drivers/media/dvb-core/dmxdev.c:1246 > __fput+0x3f8/0xb60 fs/file_table.c:450 > task_work_run+0x14e/0x250 kernel/task_work.c:239 > get_signal+0x1d3/0x2610 kernel/signal.c:2790 > arch_do_signal_or_restart+0x90/0x7e0 arch/x86/kernel/signal.c:337 > exit_to_user_mode_loop kernel/entry/common.c:111 [inline] > exit_to_user_mode_prepare include/linux/entry-common.h:329 [inline] > __syscall_exit_to_user_mode_work kernel/entry/common.c:207 [inline] > syscall_exit_to_user_mode+0x150/0x2a0 kernel/entry/common.c:218 > do_syscall_64+0xda/0x250 arch/x86/entry/common.c:89 > entry_SYSCALL_64_after_hwframe+0x77/0x7f > > Reported-by: syzbot+5e248227c80a3be8e...@syzkaller.appspotmail.com > Closes: https://syzkaller.appspot.com/bug?extid=5e248227c80a3be8e96a > Signed-off-by: Edward Adam Davis <eada...@qq.com> > Signed-off-by: Hans Verkuil <hverk...@xs4all.nl>
Patch committed. Thanks, Hans Verkuil drivers/media/test-drivers/vidtv/vidtv_bridge.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) --- diff --git a/drivers/media/test-drivers/vidtv/vidtv_bridge.c b/drivers/media/test-drivers/vidtv/vidtv_bridge.c index e1dd8adeba46..438483c62fac 100644 --- a/drivers/media/test-drivers/vidtv/vidtv_bridge.c +++ b/drivers/media/test-drivers/vidtv/vidtv_bridge.c @@ -191,10 +191,11 @@ static int vidtv_start_streaming(struct vidtv_dvb *dvb) mux_args.mux_buf_sz = mux_buf_sz; - dvb->streaming = true; dvb->mux = vidtv_mux_init(dvb->fe[0], dev, &mux_args); if (!dvb->mux) return -ENOMEM; + + dvb->streaming = true; vidtv_mux_start_thread(dvb->mux); dev_dbg_ratelimited(dev, "Started streaming\n"); @@ -205,6 +206,11 @@ static int vidtv_stop_streaming(struct vidtv_dvb *dvb) { struct device *dev = &dvb->pdev->dev; + if (!dvb->streaming) { + dev_warn_ratelimited(dev, "No streaming. Skipping.\n"); + return 0; + } + dvb->streaming = false; vidtv_mux_stop_thread(dvb->mux); vidtv_mux_destroy(dvb->mux);