Re: [PATCH 1/1] nfsd: nfsd4_setclientid_confirm mistakenly expires confirmed client.

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

 



Hi Dai-

> On Jan 26, 2022, at 4:13 PM, Dai Ngo <dai.ngo@xxxxxxxxxx> wrote:
> 
> 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 intents to do what the spec describes above but
> it forgot to set 'old' to NULL resulting to the confirmed client
> to be expired.
> 
> Signed-off-by: Dai Ngo <dai.ngo@xxxxxxxxxx>

On it's face, this seems like the correct thing to do.

I believe the issue was introduced in commit 2b63482185e6 ("nfsd:
fix clid_inuse on mount with security change") in 2015. I can
add a Fixes: tag and apply this for 5.17-rc.


> ---
> fs/nfsd/nfs4state.c | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
> index 72900b89cf84..32063733443d 100644
> --- a/fs/nfsd/nfs4state.c
> +++ b/fs/nfsd/nfs4state.c
> @@ -4130,8 +4130,10 @@ nfsd4_setclientid_confirm(struct svc_rqst *rqstp,
> 			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;
> -- 
> 2.9.5
> 

--
Chuck Lever







[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