| From ab451ea952fe9d7afefae55ddb28943a148247fe Mon Sep 17 00:00:00 2001 |
| From: Dai Ngo <dai.ngo@oracle.com> |
| Date: Wed, 26 Jan 2022 13:13:38 -0800 |
| Subject: nfsd: nfsd4_setclientid_confirm mistakenly expires confirmed client. |
| |
| From: Dai Ngo <dai.ngo@oracle.com> |
| |
| commit ab451ea952fe9d7afefae55ddb28943a148247fe upstream. |
| |
| From RFC 7530 Section 16.34.5: |
| |
| o The server has not recorded an unconfirmed { v, x, c, *, * } and |
| has recorded a confirmed { v, x, c, *, s }. If the principals of |
| the record and of SETCLIENTID_CONFIRM do not match, the server |
| returns NFS4ERR_CLID_INUSE without removing any relevant leased |
| client state, and without changing recorded callback and |
| callback_ident values for client { x }. |
| |
| The current code intends to do what the spec describes above but |
| it forgot to set 'old' to NULL resulting to the confirmed client |
| to be expired. |
| |
| Fixes: 2b63482185e6 ("nfsd: fix clid_inuse on mount with security change") |
| Signed-off-by: Dai Ngo <dai.ngo@oracle.com> |
| Signed-off-by: Chuck Lever <chuck.lever@oracle.com> |
| Reviewed-by: Bruce Fields <bfields@fieldses.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| fs/nfsd/nfs4state.c | 4 +++- |
| 1 file changed, 3 insertions(+), 1 deletion(-) |
| |
| --- a/fs/nfsd/nfs4state.c |
| +++ b/fs/nfsd/nfs4state.c |
| @@ -4047,8 +4047,10 @@ nfsd4_setclientid_confirm(struct svc_rqs |
| status = nfserr_clid_inuse; |
| if (client_has_state(old) |
| && !same_creds(&unconf->cl_cred, |
| - &old->cl_cred)) |
| + &old->cl_cred)) { |
| + old = NULL; |
| goto out; |
| + } |
| status = mark_client_expired_locked(old); |
| if (status) { |
| old = NULL; |