NFSv4.0 fix client reference leak in callback
If there is an error during processing of a callback message, it leads to refrence leak on the client structure and eventually an unclean superblock. Signed-off-by: Olga Kornievskaia <kolga@netapp.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
parent
1a54c0cfcb
commit
32cd3ee511
@ -883,16 +883,21 @@ static __be32 nfs4_callback_compound(struct svc_rqst *rqstp)
|
|||||||
|
|
||||||
if (hdr_arg.minorversion == 0) {
|
if (hdr_arg.minorversion == 0) {
|
||||||
cps.clp = nfs4_find_client_ident(SVC_NET(rqstp), hdr_arg.cb_ident);
|
cps.clp = nfs4_find_client_ident(SVC_NET(rqstp), hdr_arg.cb_ident);
|
||||||
if (!cps.clp || !check_gss_callback_principal(cps.clp, rqstp))
|
if (!cps.clp || !check_gss_callback_principal(cps.clp, rqstp)) {
|
||||||
|
if (cps.clp)
|
||||||
|
nfs_put_client(cps.clp);
|
||||||
goto out_invalidcred;
|
goto out_invalidcred;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
cps.minorversion = hdr_arg.minorversion;
|
cps.minorversion = hdr_arg.minorversion;
|
||||||
hdr_res.taglen = hdr_arg.taglen;
|
hdr_res.taglen = hdr_arg.taglen;
|
||||||
hdr_res.tag = hdr_arg.tag;
|
hdr_res.tag = hdr_arg.tag;
|
||||||
if (encode_compound_hdr_res(&xdr_out, &hdr_res) != 0)
|
if (encode_compound_hdr_res(&xdr_out, &hdr_res) != 0) {
|
||||||
|
if (cps.clp)
|
||||||
|
nfs_put_client(cps.clp);
|
||||||
return rpc_system_err;
|
return rpc_system_err;
|
||||||
|
}
|
||||||
while (status == 0 && nops != hdr_arg.nops) {
|
while (status == 0 && nops != hdr_arg.nops) {
|
||||||
status = process_op(nops, rqstp, &xdr_in,
|
status = process_op(nops, rqstp, &xdr_in,
|
||||||
rqstp->rq_argp, &xdr_out, rqstp->rq_resp,
|
rqstp->rq_argp, &xdr_out, rqstp->rq_resp,
|
||||||
|
Loading…
Reference in New Issue
Block a user