ACK: [PATCH 1/2][T/X/B/C/D] mount: Retest MNT_LOCKED in do_umount

Colin Ian King colin.king at canonical.com
Tue Nov 13 13:55:30 UTC 2018


On 13/11/2018 07:44, Tyler Hicks wrote:
> From: "Eric W. Biederman" <ebiederm at xmission.com>
> 
> BugLink: https://launchpad.net/bugs/1789161
> 
> It was recently pointed out that the one instance of testing MNT_LOCKED
> outside of the namespace_sem is in ksys_umount.
> 
> Fix that by adding a test inside of do_umount with namespace_sem and
> the mount_lock held.  As it helps to fail fails the existing test is
> maintained with an additional comment pointing out that it may be racy
> because the locks are not held.
> 
> Cc: stable at vger.kernel.org
> Reported-by: Al Viro <viro at ZenIV.linux.org.uk>
> Fixes: 5ff9d8a65ce8 ("vfs: Lock in place mounts from more privileged users")
> Signed-off-by: "Eric W. Biederman" <ebiederm at xmission.com>
> (cherry picked from commit 25d202ed820ee347edec0bf3bf553544556bf64b)
> Signed-off-by: Tyler Hicks <tyhicks at canonical.com>
> ---
>  fs/namespace.c | 10 ++++++++--
>  1 file changed, 8 insertions(+), 2 deletions(-)
> 
> diff --git a/fs/namespace.c b/fs/namespace.c
> index c53645816531..3fbffe0788d1 100644
> --- a/fs/namespace.c
> +++ b/fs/namespace.c
> @@ -1633,8 +1633,13 @@ static int do_umount(struct mount *mnt, int flags)
>  
>  	namespace_lock();
>  	lock_mount_hash();
> -	event++;
>  
> +	/* Recheck MNT_LOCKED with the locks held */
> +	retval = -EINVAL;
> +	if (mnt->mnt.mnt_flags & MNT_LOCKED)
> +		goto out;
> +
> +	event++;
>  	if (flags & MNT_DETACH) {
>  		if (!list_empty(&mnt->mnt_list))
>  			umount_tree(mnt, UMOUNT_PROPAGATE);
> @@ -1648,6 +1653,7 @@ static int do_umount(struct mount *mnt, int flags)
>  			retval = 0;
>  		}
>  	}
> +out:
>  	unlock_mount_hash();
>  	namespace_unlock();
>  	return retval;
> @@ -1738,7 +1744,7 @@ int ksys_umount(char __user *name, int flags)
>  		goto dput_and_out;
>  	if (!check_mnt(mnt))
>  		goto dput_and_out;
> -	if (mnt->mnt.mnt_flags & MNT_LOCKED)
> +	if (mnt->mnt.mnt_flags & MNT_LOCKED) /* Check optimistically */
>  		goto dput_and_out;
>  	retval = -EPERM;
>  	if (flags & MNT_FORCE && !capable(CAP_SYS_ADMIN))
> 

Clean upstream cherry pick.

Acked-by: Colin Ian King <colin.king at canonical.com>



More information about the kernel-team mailing list