4.18-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Olga Kornievskaia <ko...@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 <ko...@netapp.com>
Signed-off-by: Anna Schumaker <anna.schuma...@netapp.com>
Signed-off-by: Sasha Levin <alexander.le...@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gre...@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
@@ -883,16 +883,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,


Reply via email to