android_kernel_google_msm/fs
Eric W. Biederman c48074f579 BACKPORT: propogate_mnt: Handle the first propogated copy being a slave
commit 5ec0811d30378ae104f250bfc9b3640242d81e3f upstream.

When the first propgated copy was a slave the following oops would result:
> BUG: unable to handle kernel NULL pointer dereference at 0000000000000010
> IP: [<ffffffff811fba4e>] propagate_one+0xbe/0x1c0
> PGD bacd4067 PUD bac66067 PMD 0
> Oops: 0000 [#1] SMP
> Modules linked in:
> CPU: 1 PID: 824 Comm: mount Not tainted 4.6.0-rc5userns+ #1523
> Hardware name: Bochs Bochs, BIOS Bochs 01/01/2007
> task: ffff8800bb0a8000 ti: ffff8800bac3c000 task.ti: ffff8800bac3c000
> RIP: 0010:[<ffffffff811fba4e>]  [<ffffffff811fba4e>] propagate_one+0xbe/0x1c0
> RSP: 0018:ffff8800bac3fd38  EFLAGS: 00010283
> RAX: 0000000000000000 RBX: ffff8800bb77ec00 RCX: 0000000000000010
> RDX: 0000000000000000 RSI: ffff8800bb58c000 RDI: ffff8800bb58c480
> RBP: ffff8800bac3fd48 R08: 0000000000000001 R09: 0000000000000000
> R10: 0000000000001ca1 R11: 0000000000001c9d R12: 0000000000000000
> R13: ffff8800ba713800 R14: ffff8800bac3fda0 R15: ffff8800bb77ec00
> FS:  00007f3c0cd9b7e0(0000) GS:ffff8800bfb00000(0000) knlGS:0000000000000000
> CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> CR2: 0000000000000010 CR3: 00000000bb79d000 CR4: 00000000000006e0
> Stack:
>  ffff8800bb77ec00 0000000000000000 ffff8800bac3fd88 ffffffff811fbf85
>  ffff8800bac3fd98 ffff8800bb77f080 ffff8800ba713800 ffff8800bb262b40
>  0000000000000000 0000000000000000 ffff8800bac3fdd8 ffffffff811f1da0
> Call Trace:
>  [<ffffffff811fbf85>] propagate_mnt+0x105/0x140
>  [<ffffffff811f1da0>] attach_recursive_mnt+0x120/0x1e0
>  [<ffffffff811f1ec3>] graft_tree+0x63/0x70
>  [<ffffffff811f1f6b>] do_add_mount+0x9b/0x100
>  [<ffffffff811f2c1a>] do_mount+0x2aa/0xdf0
>  [<ffffffff8117efbe>] ? strndup_user+0x4e/0x70
>  [<ffffffff811f3a45>] SyS_mount+0x75/0xc0
>  [<ffffffff8100242b>] do_syscall_64+0x4b/0xa0
>  [<ffffffff81988f3c>] entry_SYSCALL64_slow_path+0x25/0x25
> Code: 00 00 75 ec 48 89 0d 02 22 22 01 8b 89 10 01 00 00 48 89 05 fd 21 22 01 39 8e 10 01 00 00 0f 84 e0 00 00 00 48 8b 80 d8 00 00 00 <48> 8b 50 10 48 89 05 df 21 22 01 48 89 15 d0 21 22 01 8b 53 30
> RIP  [<ffffffff811fba4e>] propagate_one+0xbe/0x1c0
>  RSP <ffff8800bac3fd38>
> CR2: 0000000000000010
> ---[ end trace 2725ecd95164f217 ]---

This oops happens with the namespace_sem held and can be triggered by
non-root users.  An all around not pleasant experience.

To avoid this scenario when finding the appropriate source mount to
copy stop the walk up the mnt_master chain when the first source mount
is encountered.

Further rewrite the walk up the last_source mnt_master chain so that
it is clear what is going on.

The reason why the first source mount is special is that it it's
mnt_parent is not a mount in the dest_mnt propagation tree, and as
such termination conditions based up on the dest_mnt mount propgation
tree do not make sense.

To avoid other kinds of confusion last_dest is not changed when
computing last_source.  last_dest is only used once in propagate_one
and that is above the point of the code being modified, so changing
the global variable is meaningless and confusing.

fixes: f2ebb3a921 ("smarter propagate_mnt()")
Reported-by: Tycho Andersen <tycho.andersen@canonical.com>
Reviewed-by: Seth Forshee <seth.forshee@canonical.com>
Tested-by: Seth Forshee <seth.forshee@canonical.com>
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Change-Id: Ie55a2c52db9773b461acc6ebe427221acb7093f0
2021-09-16 14:14:38 -04:00
..
9p fs: make posix_acl_create more useful 2020-12-07 21:02:49 +03:00
adfs fs: push sync_filesystem() down to the file system's remount_fs() 2020-11-29 16:11:45 +03:00
affs fs: push sync_filesystem() down to the file system's remount_fs() 2020-11-29 16:11:45 +03:00
afs don't pass nameidata to ->create() 2018-12-07 22:28:00 +04:00
autofs4 stop passing nameidata to ->lookup() 2018-12-07 22:26:28 +04:00
befs fs: push sync_filesystem() down to the file system's remount_fs() 2020-11-29 16:11:45 +03:00
bfs don't pass nameidata to ->create() 2018-12-07 22:28:00 +04:00
btrfs fs: make posix_acl_create more useful 2020-12-07 21:02:49 +03:00
cachefiles don't pass nameidata * to vfs_create() 2018-12-07 22:28:48 +04:00
ceph mm: kill vma flag VM_CAN_NONLINEAR 2020-11-29 16:11:40 +03:00
cifs fs: push sync_filesystem() down to the file system's remount_fs() 2020-11-29 16:11:45 +03:00
coda fs: push sync_filesystem() down to the file system's remount_fs() 2020-11-29 16:11:45 +03:00
configfs stop passing nameidata to ->lookup() 2018-12-07 22:26:28 +04:00
cramfs fs: push sync_filesystem() down to the file system's remount_fs() 2020-11-29 16:11:45 +03:00
crypto
debugfs fs: push sync_filesystem() down to the file system's remount_fs() 2020-11-29 16:11:45 +03:00
devpts fs: push sync_filesystem() down to the file system's remount_fs() 2020-11-29 16:11:45 +03:00
dlm
ecryptfs don't pass nameidata * to vfs_create() 2018-12-07 22:28:48 +04:00
efs fs: push sync_filesystem() down to the file system's remount_fs() 2020-11-29 16:11:45 +03:00
exofs don't pass nameidata to ->create() 2018-12-07 22:28:00 +04:00
exportfs
ext2 fs: make posix_acl_create more useful 2020-12-07 21:02:49 +03:00
ext3 fs: make posix_acl_create more useful 2020-12-07 21:02:49 +03:00
ext4 fs: make posix_acl_create more useful 2020-12-07 21:02:49 +03:00
f2fs fs: make posix_acl_create more useful 2020-12-07 21:02:49 +03:00
fat fs: push sync_filesystem() down to the file system's remount_fs() 2020-11-29 16:11:45 +03:00
freevxfs fs: push sync_filesystem() down to the file system's remount_fs() 2020-11-29 16:11:45 +03:00
fscache lib/radix-tree.c: make radix_tree_node_alloc() work correctly within interrupt 2020-12-07 21:02:05 +03:00
fuse fs: push sync_filesystem() down to the file system's remount_fs() 2020-11-29 16:11:45 +03:00
gfs2 fs: make posix_acl_create more useful 2020-12-07 21:02:49 +03:00
hfs fs: push sync_filesystem() down to the file system's remount_fs() 2020-11-29 16:11:45 +03:00
hfsplus fs: push sync_filesystem() down to the file system's remount_fs() 2020-11-29 16:11:45 +03:00
hostfs don't pass nameidata to ->create() 2018-12-07 22:28:00 +04:00
hpfs fs: push sync_filesystem() down to the file system's remount_fs() 2020-11-29 16:11:45 +03:00
hppfs stop passing nameidata to ->lookup() 2018-12-07 22:26:28 +04:00
hugetlbfs don't pass nameidata to ->create() 2018-12-07 22:28:00 +04:00
isofs stop passing nameidata to ->lookup() 2018-12-07 22:26:28 +04:00
jbd
jbd2
jffs2 fs: make posix_acl_create more useful 2020-12-07 21:02:49 +03:00
jfs fs: make posix_acl_create more useful 2020-12-07 21:02:49 +03:00
lockd
logfs don't pass nameidata to ->create() 2018-12-07 22:28:00 +04:00
minix fs: push sync_filesystem() down to the file system's remount_fs() 2020-11-29 16:11:45 +03:00
ncpfs fs: push sync_filesystem() down to the file system's remount_fs() 2020-11-29 16:11:45 +03:00
nfs fs: Limit sys_mount to only request filesystem modules. 2020-12-14 20:34:05 +01:00
nfs_common
nfsd userns: Pass a userns parameter into posix_acl_to_xattr and posix_acl_from_xattr 2020-12-07 21:02:21 +03:00
nilfs2 fs: push sync_filesystem() down to the file system's remount_fs() 2020-11-29 16:11:45 +03:00
nls
notify fanotify: check file flags passed in fanotify_init 2018-12-07 22:28:48 +04:00
ntfs fs: push sync_filesystem() down to the file system's remount_fs() 2020-11-29 16:11:45 +03:00
ocfs2 fs: make posix_acl_create more useful 2020-12-07 21:02:49 +03:00
omfs don't pass nameidata to ->create() 2018-12-07 22:28:00 +04:00
openpromfs fs: push sync_filesystem() down to the file system's remount_fs() 2020-11-29 16:11:45 +03:00
proc fs: push sync_filesystem() down to the file system's remount_fs() 2020-11-29 16:11:45 +03:00
pstore fs: push sync_filesystem() down to the file system's remount_fs() 2020-11-29 16:11:45 +03:00
qnx4 fs: push sync_filesystem() down to the file system's remount_fs() 2020-11-29 16:11:45 +03:00
qnx6 fs: push sync_filesystem() down to the file system's remount_fs() 2020-11-29 16:11:45 +03:00
quota vfs: define struct filename and have getname() return it 2018-12-07 22:28:48 +04:00
ramfs don't pass nameidata to ->create() 2018-12-07 22:28:00 +04:00
reiserfs fs: make posix_acl_create more useful 2020-12-07 21:02:49 +03:00
romfs fs: push sync_filesystem() down to the file system's remount_fs() 2020-11-29 16:11:45 +03:00
sdcardfs ANDROID: sdcardfs: Add option to not link obb 2021-05-08 17:13:15 -04:00
squashfs fs: push sync_filesystem() down to the file system's remount_fs() 2020-11-29 16:11:45 +03:00
sysfs stop passing nameidata to ->lookup() 2018-12-07 22:26:28 +04:00
sysv fs: push sync_filesystem() down to the file system's remount_fs() 2020-11-29 16:11:45 +03:00
ubifs fs: push sync_filesystem() down to the file system's remount_fs() 2020-11-29 16:11:45 +03:00
udf fs: push sync_filesystem() down to the file system's remount_fs() 2020-11-29 16:11:45 +03:00
ufs fs: push sync_filesystem() down to the file system's remount_fs() 2020-11-29 16:11:45 +03:00
xfs fs: make posix_acl_create more useful 2020-12-07 21:02:49 +03:00
yaffs2
aio.c Merge remote-tracking branch 'stable/linux-3.4.y' into lineage-15.1 2017-12-27 17:13:15 +03:00
anon_inodes.c
attr.c Merge remote-tracking branch 'stable/linux-3.4.y' into lineage-15.1 2017-12-27 17:13:15 +03:00
bad_inode.c mm/fs: remove truncate_range 2020-12-07 20:57:30 +03:00
binfmt_aout.c
binfmt_elf.c
binfmt_elf_fdpic.c
binfmt_em86.c
binfmt_flat.c
binfmt_misc.c Merge remote-tracking branch 'stable/linux-3.4.y' into lineage-15.1 2017-12-27 17:13:15 +03:00
binfmt_script.c
binfmt_som.c
bio-integrity.c
bio.c
block_dev.c
buffer.c Merge remote-tracking branch 'stable/linux-3.4.y' into lineage-15.1 2017-12-27 17:13:15 +03:00
char_dev.c
compat.c locks: rename file-private locks to "open file description locks" 2021-01-24 09:56:22 +00:00
compat_binfmt_elf.c
compat_ioctl.c Merge remote-tracking branch 'stable/linux-3.4.y' into lineage-15.1 2017-12-27 17:13:15 +03:00
dcache.c [O_TMPFILE] it's still short a few helpers, but infrastructure should be OK now... 2018-12-07 22:28:48 +04:00
dcookies.c
direct-io.c
drop_caches.c
eventfd.c
eventpoll.c Merge remote-tracking branch 'stable/linux-3.4.y' into lineage-15.1 2017-12-27 17:13:15 +03:00
exec.c vfs: make path_openat take a struct filename pointer 2018-12-07 22:28:48 +04:00
fcntl.c locks: rename file-private locks to "open file description locks" 2021-01-24 09:56:22 +00:00
fhandle.c
fifo.c
file.c
file_table.c locks: rename locks_remove_flock to locks_remove_file 2021-01-24 09:56:22 +00:00
filesystems.c vfs: define struct filename and have getname() return it 2018-12-07 22:28:48 +04:00
fs-writeback.c Merge remote-tracking branch 'stable/linux-3.4.y' into lineage-15.1 2017-12-27 17:13:15 +03:00
fs_struct.c sdcardfs: override umask on mkdir and create 2017-09-22 19:12:02 +03:00
inode.c mm: allow drivers to prevent new writable mappings 2020-12-07 21:08:09 +03:00
internal.h vfs: make path_openat take a struct filename pointer 2018-12-07 22:28:48 +04:00
ioctl.c
ioprio.c Merge remote-tracking branch 'stable/linux-3.4.y' into lineage-15.1 2017-12-27 17:13:15 +03:00
Kconfig fs: remove generic_acl 2020-12-07 21:02:53 +03:00
Kconfig.binfmt
libfs.c stop passing nameidata to ->lookup() 2018-12-07 22:26:28 +04:00
locks.c locks: print unsigned ino in /proc/locks 2021-01-24 09:56:22 +00:00
Makefile fs: remove generic_acl 2020-12-07 21:02:53 +03:00
mbcache.c
mount.h
mpage.c
namei.c fs: add get_acl helper 2020-12-07 21:02:40 +03:00
namespace.c vfs: define struct filename and have getname() return it 2018-12-07 22:28:48 +04:00
no-block.c
open.c fs: Fix file mode for O_TMPFILE 2018-12-07 22:28:48 +04:00
pipe.c Merge remote-tracking branch 'stable/linux-3.4.y' into lineage-15.1 2017-12-27 17:13:15 +03:00
pnode.c BACKPORT: propogate_mnt: Handle the first propogated copy being a slave 2021-09-16 14:14:38 -04:00
pnode.h ANDROID: mnt: remount should propagate to slaves of slaves 2017-09-22 19:12:11 +03:00
posix_acl.c fs: NULL dereference in posix_acl_to_xattr() 2020-12-07 21:05:11 +03:00
proc_namespace.c vfs: Allow filesystems to access their private mount data 2017-09-22 19:12:06 +03:00
read_write.c
read_write.h
readdir.c
select.c Merge remote-tracking branch 'stable/linux-3.4.y' into lineage-15.1 2017-12-27 17:13:15 +03:00
seq_file.c
signalfd.c
splice.c Merge remote-tracking branch 'stable/linux-3.4.y' into lineage-15.1 2017-12-27 17:13:15 +03:00
stack.c
stat.c vfs: make O_PATH file descriptors usable for 'fstat()' 2020-11-22 01:21:34 +03:00
statfs.c
super.c vmscan: remove obsolete shrink_control comment 2020-11-29 16:11:26 +03:00
sync.c fs/sync.c: make sync_file_range(2) use WB_SYNC_NONE writeback 2017-12-31 13:02:49 +03:00
timerfd.c
utimes.c vfs: Add setattr2 for filesystems with per mount permissions 2017-09-22 19:12:07 +03:00
xattr.c fs, xattr: fix bug when removing a name not in xattr list 2020-12-07 21:02:30 +03:00