[PATCH] NFSd: NFSv4.1 OPEN must use the session-derived client id

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



RFC5661 states:

 The client can set the clientid field to any value and the server MUST
 ignore it.  Instead, the server MUST derive the client ID from the
 session ID of the SEQUENCE operation of the COMPOUND request

Make it so...

Signed-off-by: Trond Myklebust <trond.myklebust@xxxxxxxxxxxxxxx>
---
 fs/nfsd/nfs4state.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 693e1458e2ca..d23f4cdbc891 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -2826,6 +2826,21 @@ static __be32 nfsd4_check_seqid(struct nfsd4_compound_state *cstate, struct nfs4
 	return nfserr_bad_seqid;
 }
 
+/*
+ * RFC5661: OPEN MUST ignore the client-supplied clientid argument and
+ * substitute the session clientid
+ */
+static void nfsd41_set_open_clientid(struct nfsd4_compound_state *cstate,
+		struct nfsd4_open *open)
+{
+	struct nfs4_client *clp;
+
+	if (!nfsd4_has_session(cstate))
+		return;
+	clp = cstate->session->se_client;
+	memcpy(&open->op_clientid, &clp->cl_clientid, sizeof(open->op_clientid));
+}
+
 __be32
 nfsd4_process_open1(struct nfsd4_compound_state *cstate,
 		    struct nfsd4_open *open, struct nfsd_net *nn)
@@ -2836,6 +2851,8 @@ nfsd4_process_open1(struct nfsd4_compound_state *cstate,
 	struct nfs4_openowner *oo = NULL;
 	__be32 status;
 
+	nfsd41_set_open_clientid(cstate, open);
+
 	if (STALE_CLIENTID(&open->op_clientid, nn))
 		return nfserr_stale_clientid;
 	/*
-- 
1.8.5.3

--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux