aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2016-06-07 13:04:35 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-06-07 13:04:35 -0400
commit43c082e72745555952126848a40db3a06fc8a7a9 (patch)
tree18d81105fee1386e40766cfc852e64d6a432cf21
parent3613a6245b9fb5091724961e502fd1228de40f32 (diff)
parentd71ed6c930ac7d8f88f3cef6624a7e826392d61f (diff)
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace
Pull userns fixes from Eric Biederman: "This contains two small but significant fixes to fs/namespace.c. The first adds a filesystem refcount drop on error. The second corrects a test in fs_fully_visible which could be abused to allow mounting of proc or sysfs, when that should not be allowed. To keep myself honest I have tested to ensure the incorrect test in fs_fully_visible actually allows improper mounting of proc before the fix and that when fixed the improper mounting is not allowed" * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace: mnt: fs_fully_visible test the proper mount for MNT_LOCKED mnt: If fs_fully_visible fails call put_filesystem.
-rw-r--r--fs/namespace.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/fs/namespace.c b/fs/namespace.c
index 4fb1691b4355..a7ec92c051f5 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -2409,8 +2409,10 @@ static int do_new_mount(struct path *path, const char *fstype, int flags,
2409 mnt_flags |= MNT_NODEV | MNT_LOCK_NODEV; 2409 mnt_flags |= MNT_NODEV | MNT_LOCK_NODEV;
2410 } 2410 }
2411 if (type->fs_flags & FS_USERNS_VISIBLE) { 2411 if (type->fs_flags & FS_USERNS_VISIBLE) {
2412 if (!fs_fully_visible(type, &mnt_flags)) 2412 if (!fs_fully_visible(type, &mnt_flags)) {
2413 put_filesystem(type);
2413 return -EPERM; 2414 return -EPERM;
2415 }
2414 } 2416 }
2415 } 2417 }
2416 2418
@@ -3271,7 +3273,7 @@ static bool fs_fully_visible(struct file_system_type *type, int *new_mnt_flags)
3271 list_for_each_entry(child, &mnt->mnt_mounts, mnt_child) { 3273 list_for_each_entry(child, &mnt->mnt_mounts, mnt_child) {
3272 struct inode *inode = child->mnt_mountpoint->d_inode; 3274 struct inode *inode = child->mnt_mountpoint->d_inode;
3273 /* Only worry about locked mounts */ 3275 /* Only worry about locked mounts */
3274 if (!(mnt_flags & MNT_LOCKED)) 3276 if (!(child->mnt.mnt_flags & MNT_LOCKED))
3275 continue; 3277 continue;
3276 /* Is the directory permanetly empty? */ 3278 /* Is the directory permanetly empty? */
3277 if (!is_empty_dir_inode(inode)) 3279 if (!is_empty_dir_inode(inode))