15 Oct, 2020

1 commit

  • Fix data race in prepend_path() with re-reading mnt->mnt_ns twice
    without holding the lock.

    is_mounted() does check for NULL, but is_anon_ns(mnt->mnt_ns) might
    re-read the pointer again which could be NULL already, if in between
    reads one of kern_unmount()/kern_unmount_array()/umount_tree() sets
    mnt->mnt_ns to NULL.

    This is seen in production with the following stack trace:

    BUG: kernel NULL pointer dereference, address: 0000000000000048
    ...
    RIP: 0010:prepend_path.isra.4+0x1ce/0x2e0
    Call Trace:
    d_path+0xe6/0x150
    proc_pid_readlink+0x8f/0x100
    vfs_readlink+0xf8/0x110
    do_readlinkat+0xfd/0x120
    __x64_sys_readlinkat+0x1a/0x20
    do_syscall_64+0x42/0x110
    entry_SYSCALL_64_after_hwframe+0x44/0xa9

    Fixes: f2683bd8d5bd ("[PATCH] fix d_absolute_path() interplay with fsmount()")
    Signed-off-by: Andrii Nakryiko
    Reviewed-by: Josef Bacik
    Cc: Alexander Viro
    Signed-off-by: Linus Torvalds

    Andrii Nakryiko
     

31 Aug, 2019

1 commit


21 May, 2019

1 commit


30 Mar, 2018

1 commit