Patch "nfsd: do nfs4_check_fh in nfs4_check_file instead of nfs4_check_olstateid" has been added to the 4.1-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
nfsd: do nfs4_check_fh in nfs4_check_file instead of nfs4_check_olstateid
to the 4.1-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
nfsd-do-nfs4_check_fh-in-nfs4_check_file-instead-of-nfs4_check_olstateid.patch
and it can be found in the queue-4.1 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
8fcd461db7c09337b6d2e22d25eb411123f379e3Mon Sep 17 00:00:00 2001
From: Jeff Layton <[email protected]>
Date: Thu, 30 Jul 2015 06:57:46 -0400
Subject: nfsd: do nfs4_check_fh in nfs4_check_file instead of nfs4_check_olstateid
From: Jeff Layton <[email protected]>
commit 8fcd461db7c09337b6d2e22d25eb411123f379e3 upstream.
Currently, preprocess_stateid_op calls nfs4_check_olstateid which verifies that the open stateid corresponds to the current filehandle in the call by calling nfs4_check_fh.
If the stateid is a NFS4_DELEG_STID however, then no such check is done. This could cause incorrect enforcement of permissions, because the nfsd_permission() call in nfs4_check_file uses current the current filehandle, but any subsequent IO operation will use the file descriptor in the stateid.
Move the call to nfs4_check_fh into nfs4_check_file instead so that it can be done for all stateid types.
--- fs/nfsd/nfs4state.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
fs/nfsd/nfs4state.c +6 -6
@@ -4397,9 +4397,9 @@ laundromat_main(struct work_struct *launqueue_delayed_work (laundry_wq, &nn->laundromat_work, t*HZ ); } -static inline __be32 nfs4_check_fh (struct svc_fh *fhp,struct nfs4_ol_stateid *stp) +static inline __be32 nfs4_check_fh (struct svc_fh *fhp,struct nfs4_stid *stp) { -if (!fh_match (&fhp->fh_handle, &stp->st_stid.sc_file->fi_fhandle)) +if (!fh_match (&fhp->fh_handle, &stp->sc_file->fi_fhandle))return nfserr_bad_stateid;return nfs_ok; }
@@ -4599,9 +4599,6 @@ nfs4_check_olstateid(struct svc_fh *fhp, {__be32 status; - status =nfs4_check_fh (fhp, ols); -if (status) -return status; status =nfsd4_check_openowner_confirmed (ols);if (status)return status;
@@ -4652,6 +4649,9 @@ nfs4_preprocess_stateid_op(struct net *n status = nfserr_bad_stateid;break ; } +if (status) + goto out; + status =nfs4_check_fh (fhp, s);if (!status && filpp) { *filpp =nfs4_find_file (s, flags);
@@ -4761,7 +4761,7 @@ static __be32 nfs4_seqid_op_checks(struc status =check_stateid_generation (stateid, &stp->st_stid.sc_stateid,nfsd4_has_session (cstate));if (status)return status; -return nfs4_check_fh (current_fh, stp); +return nfs4_check_fh (current_fh, &stp->st_stid); }/*
Patches currently in stable-queue which might be from [email protected] are
queue-4.1/nfsd-do-nfs4_check_fh-in-nfs4_check_file-instead-of-nfs4_check_olstateid.patch queue-4.1/nfsd-refactor-nfs4_preprocess_stateid_op.patch