| From foo@baz Mon Sep 17 12:33:31 CEST 2018 |
| From: Olga Kornievskaia <kolga@netapp.com> |
| Date: Thu, 26 Jul 2018 16:04:47 -0400 |
| Subject: NFSv4.0 fix client reference leak in callback |
| |
| From: Olga Kornievskaia <kolga@netapp.com> |
| |
| [ Upstream commit 32cd3ee511f4e07ca25d71163b50e704808d22f4 ] |
| |
| 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> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| fs/nfs/callback_xdr.c | 11 ++++++++--- |
| 1 file changed, 8 insertions(+), 3 deletions(-) |
| |
| --- a/fs/nfs/callback_xdr.c |
| +++ b/fs/nfs/callback_xdr.c |
| @@ -904,16 +904,21 @@ static __be32 nfs4_callback_compound(str |
| |
| if (hdr_arg.minorversion == 0) { |
| 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; |
| + } |
| } |
| |
| cps.minorversion = hdr_arg.minorversion; |
| hdr_res.taglen = hdr_arg.taglen; |
| 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; |
| - |
| + } |
| while (status == 0 && nops != hdr_arg.nops) { |
| status = process_op(nops, rqstp, &xdr_in, |
| rqstp->rq_argp, &xdr_out, rqstp->rq_resp, |