Browse Source

mnt: Move the FS_USERNS_MOUNT check into sget_userns

Allowing a filesystem to be mounted by other than root in the initial
user namespace is a filesystem property not a mount namespace property
and as such should be checked in filesystem specific code.  Move the
FS_USERNS_MOUNT test into super.c:sget_userns().

Acked-by: Seth Forshee <seth.forshee@canonical.com>
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Eric W. Biederman 9 years ago
parent
commit
a001e74cef
2 changed files with 4 additions and 4 deletions
  1. 0 4
      fs/namespace.c
  2. 4 0
      fs/super.c

+ 0 - 4
fs/namespace.c

@@ -2397,10 +2397,6 @@ static int do_new_mount(struct path *path, const char *fstype, int flags,
 		return -ENODEV;
 		return -ENODEV;
 
 
 	if (user_ns != &init_user_ns) {
 	if (user_ns != &init_user_ns) {
-		if (!(type->fs_flags & FS_USERNS_MOUNT)) {
-			put_filesystem(type);
-			return -EPERM;
-		}
 		/* Only in special cases allow devices from mounts
 		/* Only in special cases allow devices from mounts
 		 * created outside the initial user namespace.
 		 * created outside the initial user namespace.
 		 */
 		 */

+ 4 - 0
fs/super.c

@@ -466,6 +466,10 @@ struct super_block *sget_userns(struct file_system_type *type,
 	struct super_block *old;
 	struct super_block *old;
 	int err;
 	int err;
 
 
+	if (!(flags & MS_KERNMOUNT) &&
+	    !(type->fs_flags & FS_USERNS_MOUNT) &&
+	    !capable(CAP_SYS_ADMIN))
+		return ERR_PTR(-EPERM);
 retry:
 retry:
 	spin_lock(&sb_lock);
 	spin_lock(&sb_lock);
 	if (test) {
 	if (test) {