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);

Reply via email to