xfs
[Top] [All Lists]

Re: [PATCH] xfs: Correctly lock inode when removing suid and security ma

To: Jan Kara <jack@xxxxxxx>
Subject: Re: [PATCH] xfs: Correctly lock inode when removing suid and security marks
From: Brian Foster <bfoster@xxxxxxxxxx>
Date: Tue, 2 Dec 2014 11:35:48 -0500
Cc: xfs@xxxxxxxxxxx
Delivered-to: xfs@xxxxxxxxxxx
In-reply-to: <1417532489-26580-1-git-send-email-jack@xxxxxxx>
References: <1417532489-26580-1-git-send-email-jack@xxxxxxx>
User-agent: Mutt/1.5.23 (2014-03-12)
On Tue, Dec 02, 2014 at 04:01:29PM +0100, Jan Kara wrote:
> Currently XFS calls file_remove_suid() without holding i_mutex. This is
> wrong because that function can end up messing with file permissions and
> security xattrs for which we need i_mutex held.
> 
> Fix the problem by grabbing iolock exclusively when we will need to
> change anything in permissions / xattrs.
> 
> Signed-off-by: Jan Kara <jack@xxxxxxx>
> ---

Hi Jan,

This doesn't compile... it looks like we need to include the security.h
header. FWIW, even then I get an undefined symbol error when compiling
as a module (security_inode_need_killpriv() does not appear to be
exported).

Brian

>  fs/xfs/xfs_file.c | 12 ++++++++++++
>  1 file changed, 12 insertions(+)
> 
> diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
> index eb596b419942..ad6636ac4943 100644
> --- a/fs/xfs/xfs_file.c
> +++ b/fs/xfs/xfs_file.c
> @@ -521,6 +521,18 @@ restart:
>       if (error)
>               return error;
>  
> +     /* For changing security info in file_remove_suid() we need i_mutex */
> +     if (!IS_NOSEC(inode) && *iolock == XFS_IOLOCK_SHARED) {
> +             struct dentry *dentry = file->f_path.dentry;
> +
> +             if (should_remove_suid(dentry) ||
> +                 security_inode_need_killpriv(dentry)) {
> +                     xfs_rw_iunlock(ip, *iolock);
> +                     *iolock = XFS_IOLOCK_EXCL;
> +                     xfs_rw_ilock(ip, *iolock);
> +                     goto restart;
> +             }
> +     }
>       /*
>        * If the offset is beyond the size of the file, we need to zero any
>        * blocks that fall between the existing EOF and the start of this
> -- 
> 1.8.1.4
> 
> _______________________________________________
> xfs mailing list
> xfs@xxxxxxxxxxx
> http://oss.sgi.com/mailman/listinfo/xfs

<Prev in Thread] Current Thread [Next in Thread>