summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorWeston Andros Adamson <dros@netapp.com>2012-02-17 15:20:25 -0500
committerTrond Myklebust <Trond.Myklebust@netapp.com>2012-03-01 17:10:21 -0500
commit9edbd953f8aeabf49b89c7c29ff9e31560775b27 (patch)
treeaa33f44b9935c3b303d1448f89dae52ddc8705ea /fs
parentdb8ac8ba871ae7b97118cfb2913b4986867f09a7 (diff)
NFSv4: fix server_scope memory leak
server_scope would never be freed if nfs4_check_cl_exchange_flags() returned non-zero Signed-off-by: Weston Andros Adamson <dros@netapp.com> Cc: stable@vger.kernel.org Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/nfs/nfs4proc.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 87c584dd88b1..20c3bb06763a 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -4945,8 +4945,10 @@ int nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred)
4945 clp->cl_rpcclient->cl_auth->au_flavor); 4945 clp->cl_rpcclient->cl_auth->au_flavor);
4946 4946
4947 res.server_scope = kzalloc(sizeof(struct server_scope), GFP_KERNEL); 4947 res.server_scope = kzalloc(sizeof(struct server_scope), GFP_KERNEL);
4948 if (unlikely(!res.server_scope)) 4948 if (unlikely(!res.server_scope)) {
4949 return -ENOMEM; 4949 status = -ENOMEM;
4950 goto out;
4951 }
4950 4952
4951 status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); 4953 status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
4952 if (!status) 4954 if (!status)
@@ -4963,12 +4965,13 @@ int nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred)
4963 clp->server_scope = NULL; 4965 clp->server_scope = NULL;
4964 } 4966 }
4965 4967
4966 if (!clp->server_scope) 4968 if (!clp->server_scope) {
4967 clp->server_scope = res.server_scope; 4969 clp->server_scope = res.server_scope;
4968 else 4970 goto out;
4969 kfree(res.server_scope); 4971 }
4970 } 4972 }
4971 4973 kfree(res.server_scope);
4974out:
4972 dprintk("<-- %s status= %d\n", __func__, status); 4975 dprintk("<-- %s status= %d\n", __func__, status);
4973 return status; 4976 return status;
4974} 4977}