• Chao Yu's avatar
    f2fs: fix to invalidate dcc->f2fs_issue_discard in error path · 91586ce0
    Chao Yu authored
    Syzbot reports a NULL pointer dereference issue as below:
    
     __refcount_add include/linux/refcount.h:193 [inline]
     __refcount_inc include/linux/refcount.h:250 [inline]
     refcount_inc include/linux/refcount.h:267 [inline]
     get_task_struct include/linux/sched/task.h:110 [inline]
     kthread_stop+0x34/0x1c0 kernel/kthread.c:703
     f2fs_stop_discard_thread+0x3c/0x5c fs/f2fs/segment.c:1638
     kill_f2fs_super+0x5c/0x194 fs/f2fs/super.c:4522
     deactivate_locked_super+0x70/0xe8 fs/super.c:332
     deactivate_super+0xd0/0xd4 fs/super.c:363
     cleanup_mnt+0x1f8/0x234 fs/namespace.c:1186
     __cleanup_mnt+0x20/0x30 fs/namespace.c:1193
     task_work_run+0xc4/0x14c kernel/task_work.c:177
     exit_task_work include/linux/task_work.h:38 [inline]
     do_exit+0x26c/0xbe0 kernel/exit.c:795
     do_group_exit+0x60/0xe8 kernel/exit.c:925
     __do_sys_exit_group kernel/exit.c:936 [inline]
     __se_sys_exit_group kernel/exit.c:934 [inline]
     __wake_up_parent+0x0/0x40 kernel/exit.c:934
     __invoke_syscall arch/arm64/kernel/syscall.c:38 [inline]
     invoke_syscall arch/arm64/kernel/syscall.c:52 [inline]
     el0_svc_common+0x138/0x220 arch/arm64/kernel/syscall.c:142
     do_el0_svc+0x48/0x164 arch/arm64/kernel/syscall.c:206
     el0_svc+0x58/0x150 arch/arm64/kernel/entry-common.c:636
     el0t_64_sync_handler+0x84/0xf0 arch/arm64/kernel/entry-common.c:654
     el0t_64_sync+0x18c/0x190 arch/arm64/kernel/entry.S:581
    
    The root cause of this issue is in error path of f2fs_start_discard_thread(),
    it missed to invalidate dcc->f2fs_issue_discard, later kthread_stop() may
    access invalid pointer.
    
    Fixes: 4d674904 ("f2fs: Don't create discard thread when device doesn't support realtime discard")
    Reported-by: syzbot+035a381ea1afb63f098d@syzkaller.appspotmail.com
    Reported-by: syzbot+729c925c2d9fc495ddee@syzkaller.appspotmail.com
    Signed-off-by: default avatarChao Yu <chao@kernel.org>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    91586ce0
segment.c 134 KB