mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2024-12-29 17:23:36 +00:00
nfsd-6.9 fixes:
- Address three recently introduced regressions
-----BEGIN PGP SIGNATURE-----
iQIzBAABCAAdFiEEKLLlsBKG3yQ88j7+M2qzM29mf5cFAmYFtQkACgkQM2qzM29m
f5fSbA//S0YiPCU+bVwN+mK47vhai1Dzaw1kd2rzlfnvTCyBFVocfQU85bFV8uns
ZMcHhO6jPjRg1o/qkCzeNf+n6AVGwvgOn1jC628jTP1wJOS8WPsZtdwz8vHX/xw5
qnMwEUtfFPiDn85VyK6z6mJBWRcF/vStPc022Ie5ba5ydxD0rFmaeIc6zYX8csUe
8tbHlulYtRR97mXjxgtXC/H0scvag07MA1fRKiZRNk0jwUdtcAsHktiBfWPV2KXO
ew8saA+BLyBBdE01cq1CoMH/3wt/a5rpaiV5ePPtYkmlPVT5IEmSLZUwUVZAjMuu
qlvKF9xrH7x8/7g/SwOJdH8po0IjiRdW9EKID+6PPqXz+YYKyTe7JqZtvEzt/4x9
tGbIfyHxpUPPTZ6VedlXYW95uWG+lrKzur+zHQwsNf+U0d5Xila8euEKqvB4kDtk
riHUlvs8O6WroeHcOQ5pK72l7x8gELdVqHP6n+E0t5+2VKp/Vcqf8WlWV0suoDfa
D2EYGIzxn8NrNuivGESHfzafmHKKMn51UGrm1Sl0vF5w2LlqMfL4Yo4NIT+e69VR
E3h6wIhK7Jor9px5/tBD3Y6o9k8wT9upjA+qsrOUhxyU3T9r+s88I64gvGyABTIM
kZJHLJYROoNO6A5FSRySSH+bk/UU+wJ0s6avgHL1A2yYnyrQUzU=
=YV5O
-----END PGP SIGNATURE-----
Merge tag 'nfsd-6.9-1' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux
Pull nfsd fixes from Chuck Lever:
- Address three recently introduced regressions
* tag 'nfsd-6.9-1' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux:
NFSD: CREATE_SESSION must never cache NFS4ERR_DELAY replies
SUNRPC: Revert 561141dd49
nfsd: Fix error cleanup path in nfsd_rename()
This commit is contained in:
commit
d8e8fbec00
@ -3831,15 +3831,20 @@ nfsd4_create_session(struct svc_rqst *rqstp,
|
||||
else
|
||||
cs_slot = &unconf->cl_cs_slot;
|
||||
status = check_slot_seqid(cr_ses->seqid, cs_slot->sl_seqid, 0);
|
||||
if (status) {
|
||||
if (status == nfserr_replay_cache) {
|
||||
status = nfsd4_replay_create_session(cr_ses, cs_slot);
|
||||
goto out_free_conn;
|
||||
}
|
||||
switch (status) {
|
||||
case nfs_ok:
|
||||
cs_slot->sl_seqid++;
|
||||
cr_ses->seqid = cs_slot->sl_seqid;
|
||||
break;
|
||||
case nfserr_replay_cache:
|
||||
status = nfsd4_replay_create_session(cr_ses, cs_slot);
|
||||
fallthrough;
|
||||
case nfserr_jukebox:
|
||||
/* The server MUST NOT cache NFS4ERR_DELAY */
|
||||
goto out_free_conn;
|
||||
default:
|
||||
goto out_cache_error;
|
||||
}
|
||||
cs_slot->sl_seqid++;
|
||||
cr_ses->seqid = cs_slot->sl_seqid;
|
||||
|
||||
/* RFC 8881 Section 18.36.4 Phase 3: Client ID confirmation. */
|
||||
if (conf) {
|
||||
@ -3859,10 +3864,8 @@ nfsd4_create_session(struct svc_rqst *rqstp,
|
||||
old = find_confirmed_client_by_name(&unconf->cl_name, nn);
|
||||
if (old) {
|
||||
status = mark_client_expired_locked(old);
|
||||
if (status) {
|
||||
old = NULL;
|
||||
goto out_cache_error;
|
||||
}
|
||||
if (status)
|
||||
goto out_expired_error;
|
||||
trace_nfsd_clid_replaced(&old->cl_clientid);
|
||||
}
|
||||
move_to_confirmed(unconf);
|
||||
@ -3894,6 +3897,17 @@ nfsd4_create_session(struct svc_rqst *rqstp,
|
||||
expire_client(old);
|
||||
return status;
|
||||
|
||||
out_expired_error:
|
||||
old = NULL;
|
||||
/*
|
||||
* Revert the slot seq_nr change so the server will process
|
||||
* the client's resend instead of returning a cached response.
|
||||
*/
|
||||
if (status == nfserr_jukebox) {
|
||||
cs_slot->sl_seqid--;
|
||||
cr_ses->seqid = cs_slot->sl_seqid;
|
||||
goto out_free_conn;
|
||||
}
|
||||
out_cache_error:
|
||||
nfsd4_cache_create_session(cr_ses, cs_slot, status);
|
||||
out_free_conn:
|
||||
|
@ -1852,7 +1852,7 @@ nfsd_rename(struct svc_rqst *rqstp, struct svc_fh *ffhp, char *fname, int flen,
|
||||
trap = lock_rename(tdentry, fdentry);
|
||||
if (IS_ERR(trap)) {
|
||||
err = (rqstp->rq_vers == 2) ? nfserr_acces : nfserr_xdev;
|
||||
goto out;
|
||||
goto out_want_write;
|
||||
}
|
||||
err = fh_fill_pre_attrs(ffhp);
|
||||
if (err != nfs_ok)
|
||||
@ -1922,6 +1922,7 @@ nfsd_rename(struct svc_rqst *rqstp, struct svc_fh *ffhp, char *fname, int flen,
|
||||
}
|
||||
out_unlock:
|
||||
unlock_rename(tdentry, fdentry);
|
||||
out_want_write:
|
||||
fh_drop_write(ffhp);
|
||||
|
||||
/*
|
||||
|
@ -921,8 +921,6 @@ gss_krb5_aes_decrypt(struct krb5_ctx *kctx, u32 offset, u32 len,
|
||||
* Caller provides the truncation length of the output token (h) in
|
||||
* cksumout.len.
|
||||
*
|
||||
* Note that for RPCSEC, the "initial cipher state" is always all zeroes.
|
||||
*
|
||||
* Return values:
|
||||
* %GSS_S_COMPLETE: Digest computed, @cksumout filled in
|
||||
* %GSS_S_FAILURE: Call failed
|
||||
@ -933,19 +931,22 @@ u32 krb5_etm_checksum(struct crypto_sync_skcipher *cipher,
|
||||
int body_offset, struct xdr_netobj *cksumout)
|
||||
{
|
||||
unsigned int ivsize = crypto_sync_skcipher_ivsize(cipher);
|
||||
static const u8 iv[GSS_KRB5_MAX_BLOCKSIZE];
|
||||
struct ahash_request *req;
|
||||
struct scatterlist sg[1];
|
||||
u8 *iv, *checksumdata;
|
||||
int err = -ENOMEM;
|
||||
u8 *checksumdata;
|
||||
|
||||
checksumdata = kmalloc(crypto_ahash_digestsize(tfm), GFP_KERNEL);
|
||||
if (!checksumdata)
|
||||
return GSS_S_FAILURE;
|
||||
/* For RPCSEC, the "initial cipher state" is always all zeroes. */
|
||||
iv = kzalloc(ivsize, GFP_KERNEL);
|
||||
if (!iv)
|
||||
goto out_free_mem;
|
||||
|
||||
req = ahash_request_alloc(tfm, GFP_KERNEL);
|
||||
if (!req)
|
||||
goto out_free_cksumdata;
|
||||
goto out_free_mem;
|
||||
ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_SLEEP, NULL, NULL);
|
||||
err = crypto_ahash_init(req);
|
||||
if (err)
|
||||
@ -969,7 +970,8 @@ u32 krb5_etm_checksum(struct crypto_sync_skcipher *cipher,
|
||||
|
||||
out_free_ahash:
|
||||
ahash_request_free(req);
|
||||
out_free_cksumdata:
|
||||
out_free_mem:
|
||||
kfree(iv);
|
||||
kfree_sensitive(checksumdata);
|
||||
return err ? GSS_S_FAILURE : GSS_S_COMPLETE;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user