aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfsd
diff options
context:
space:
mode:
authorJ. Bruce Fields <bfields@redhat.com>2013-05-03 16:09:09 -0400
committerJ. Bruce Fields <bfields@redhat.com>2013-05-03 16:36:14 -0400
commit9f415eb25574db4b73a9a712a4438e41dc284922 (patch)
treec705156d18c80b649249dad2a8cd62768153f5ec /fs/nfsd
parent676e4ebd5f2c3b4fd1d2bff79b68385c23c5c105 (diff)
nfsd4: don't allow owner override on 4.1 CLAIM_FH opens
The Linux client is using CLAIM_FH to implement regular opens, not just recovery cases, so it depends on the server to check permissions correctly. Therefore the owner override, which may make sense in the delegation recovery case, isn't right in the CLAIM_FH case. Symptoms: on a client with 49f9a0fafd844c32f2abada047c0b9a5ba0d6255 "NFSv4.1: Enable open-by-filehandle", Bryan noticed this: touch test.txt chmod 000 test.txt echo test > test.txt succeeding. Cc: stable@kernel.org Reported-by: Bryan Schumaker <bjschuma@netapp.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'fs/nfsd')
-rw-r--r--fs/nfsd/nfs4proc.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
index 8ae5abfe6ba2..27d74a294515 100644
--- a/fs/nfsd/nfs4proc.c
+++ b/fs/nfsd/nfs4proc.c
@@ -279,6 +279,7 @@ do_open_fhandle(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, str
279{ 279{
280 struct svc_fh *current_fh = &cstate->current_fh; 280 struct svc_fh *current_fh = &cstate->current_fh;
281 __be32 status; 281 __be32 status;
282 int accmode = 0;
282 283
283 /* We don't know the target directory, and therefore can not 284 /* We don't know the target directory, and therefore can not
284 * set the change info 285 * set the change info
@@ -290,9 +291,19 @@ do_open_fhandle(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, str
290 291
291 open->op_truncate = (open->op_iattr.ia_valid & ATTR_SIZE) && 292 open->op_truncate = (open->op_iattr.ia_valid & ATTR_SIZE) &&
292 (open->op_iattr.ia_size == 0); 293 (open->op_iattr.ia_size == 0);
294 /*
295 * In the delegation case, the client is telling us about an
296 * open that it *already* performed locally, some time ago. We
297 * should let it succeed now if possible.
298 *
299 * In the case of a CLAIM_FH open, on the other hand, the client
300 * may be counting on us to enforce permissions (the Linux 4.1
301 * client uses this for normal opens, for example).
302 */
303 if (open->op_claim_type == NFS4_OPEN_CLAIM_DELEG_CUR_FH)
304 accmode = NFSD_MAY_OWNER_OVERRIDE;
293 305
294 status = do_open_permission(rqstp, current_fh, open, 306 status = do_open_permission(rqstp, current_fh, open, accmode);
295 NFSD_MAY_OWNER_OVERRIDE);
296 307
297 return status; 308 return status;
298} 309}