All of lore.kernel.org
 help / color / mirror / Atom feed
From: Donald Buczek <buczek@molgen.mpg.de>
To: Trond Myklebust <trond.myklebust@primarydata.com>
Cc: linux-nfs@vger.kernel.org
Subject: Re: [PATCH] NFS: Ensure we revalidate attributes before using execute_ok()
Date: Tue, 29 Dec 2015 20:51:00 +0100	[thread overview]
Message-ID: <5682E424.8070606@molgen.mpg.de> (raw)
In-Reply-To: <1451349629-47744-1-git-send-email-trond.myklebust@primarydata.com>

On 29.12.2015 01:40, Trond Myklebust wrote:
> Donald Buczek reports that NFS clients can also report incorrect
> results for access() due to lack of revalidation of attributes
> before calling execute_ok().
> Looking closely, it seems chdir() is afflicted with the same problem.
>
> Fix is to ensure we call nfs_revalidate_inode_rcu() or
> nfs_revalidate_inode() as appropriate before deciding to trust
> execute_ok().
>
> Reported-by: Donald Buczek <buczek@molgen.mpg.de>
> Link: http://lkml.kernel.org/r/1451331530-3748-1-git-send-email-buczek@molgen.mpg.de
> Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
> ---
>   fs/nfs/dir.c | 18 ++++++++++++++++--
>   1 file changed, 16 insertions(+), 2 deletions(-)
>
> diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
> index 44e519c21e18..5bd2f5bfaf57 100644
> --- a/fs/nfs/dir.c
> +++ b/fs/nfs/dir.c
> @@ -2432,6 +2432,20 @@ int nfs_may_open(struct inode *inode, struct rpc_cred *cred, int openflags)
>   }
>   EXPORT_SYMBOL_GPL(nfs_may_open);
>   
> +static int nfs_execute_ok(struct inode *inode, int mask)
> +{
> +	struct nfs_server *server = NFS_SERVER(inode);
> +	int ret;
> +
> +	if (mask & MAY_NOT_BLOCK)
> +		ret = nfs_revalidate_inode_rcu(server, inode);
> +	else
> +		ret = nfs_revalidate_inode(server, inode);
> +	if (ret == 0 && !execute_ok(inode))
> +		ret = -EACCES;
> +	return ret;
> +}
> +
>   int nfs_permission(struct inode *inode, int mask)
>   {
>   	struct rpc_cred *cred;
> @@ -2484,8 +2498,8 @@ force_lookup:
>   			res = PTR_ERR(cred);
>   	}
>   out:
> -	if (!res && (mask & MAY_EXEC) && !execute_ok(inode))
> -		res = -EACCES;
> +	if (!res && (mask & MAY_EXEC))
> +		res = nfs_execute_ok(inode, mask);
>   
>   	dfprintk(VFS, "NFS: permission(%s/%lu), mask=0x%x, res=%d\n",
>   		inode->i_sb->s_id, inode->i_ino, mask, res);

This patch doesn't resolve the problem. The reason is, that there is a 
nfs_do_access() before this nfs_execute_ok() in the execution path of 
nfs_permission.  While nfs4_proc_acccess doesn't update the mode, it 
does update read_cache_jiffies. So the later nfs_revalidate_inode will 
be a noop, the cache was just made to look fresh.

If nfs_revalidate_inode would be called before the nfs_do_access it 
might work. I fact it would make some sense to move it before the switch 
based on inode->i_mode, because the mode might change on the server, too.

Regards
   Donald

PS: Sorry for my faulty patch! What a shame :(


  reply	other threads:[~2015-12-29 19:51 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-25 12:30 [PATCH] nfs: do not deny execute access based on outdated mode in inode Donald Buczek
2015-12-26 18:36 ` Trond Myklebust
2015-12-26 23:58   ` Donald Buczek
2015-12-27  0:11     ` Trond Myklebust
2015-12-27  0:38       ` Al Viro
2015-12-27  1:26         ` Trond Myklebust
2015-12-27  2:28           ` Al Viro
2015-12-27  2:54             ` Trond Myklebust
2015-12-27  3:06               ` [PATCH] NFSv4: Don't perform cached access checks before we've OPENed the file Trond Myklebust
2015-12-27 12:18                 ` Donald Buczek
2015-12-27 16:23                   ` Trond Myklebust
2015-12-27 17:57                     ` Al Viro
2015-12-28 19:38                     ` [PATCH] nfs: revalidate inode before access checks Donald Buczek
2015-12-28 21:10                       ` Trond Myklebust
2015-12-29  0:40                         ` [PATCH] NFS: Ensure we revalidate attributes before using execute_ok() Trond Myklebust
2015-12-29 19:51                           ` Donald Buczek [this message]
2015-12-29 20:18                             ` Trond Myklebust
2015-12-30  0:02                               ` [PATCH] NFS: Fix attribute cache revalidation Trond Myklebust
2015-12-30 11:23                                 ` Donald Buczek
2015-12-30 14:04                                   ` Trond Myklebust

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5682E424.8070606@molgen.mpg.de \
    --to=buczek@molgen.mpg.de \
    --cc=linux-nfs@vger.kernel.org \
    --cc=trond.myklebust@primarydata.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.