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: [email protected]
> Closes: https://syzkaller.appspot.com/bug?extid=5e248227c80a3be8e96a
> Signed-off-by: Edward Adam Davis <[email protected]>
> Signed-off-by: Hans Verkuil <[email protected]>
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);