Andrii Nakryiko 09cad07547 fs: fix NULL dereference due to data race in prepend_path()
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 <andrii@kernel.org>
Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Cc: Alexander Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2020-10-14 14:54:45 -07:00
..
2020-10-13 12:12:44 -07:00
2020-10-13 12:12:44 -07:00
2020-10-13 08:59:39 -07:00
2020-10-13 08:54:00 -07:00
2020-10-13 12:12:44 -07:00
2020-09-21 08:59:26 -07:00
2020-10-13 12:12:44 -07:00
\n
2020-08-06 19:28:26 -07:00
2020-06-05 14:05:57 -07:00
2020-10-13 12:12:44 -07:00
2020-10-13 12:12:44 -07:00
2020-10-14 14:06:06 -07:00
2020-08-11 17:42:24 +09:00
2020-07-27 14:29:23 -04:00
2020-10-05 10:38:33 -06:00
2020-10-13 12:12:44 -07:00
2020-08-04 21:02:38 -04:00
2020-06-05 16:26:36 -07:00
2020-09-22 23:45:57 -04:00
2020-10-13 12:36:21 -07:00
2020-09-30 20:32:34 -06:00
2020-07-31 08:16:01 +02:00
2020-08-07 11:33:24 -07:00
2020-09-22 23:45:57 -04:00
2020-05-14 16:44:24 +02:00
2020-08-12 10:58:01 -07:00
2020-07-31 08:16:00 +02:00
2020-06-02 19:45:12 -07:00
2020-06-09 15:40:50 -07:00
2020-07-31 08:16:01 +02:00