浏览代码

SUNRPC: Fix a memory leak in gss_create()

Fix a memory leak in gss_create() whereby the rpc credcache was not being
freed if the rpc_mkpipe() call failed.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Trond Myklebust 18 年之前
父节点
当前提交
07a2bf1da4
共有 1 个文件被更改,包括 6 次插入4 次删除
  1. 6 4
      net/sunrpc/auth_gss/auth_gss.c

+ 6 - 4
net/sunrpc/auth_gss/auth_gss.c

@@ -636,10 +636,6 @@ gss_create(struct rpc_clnt *clnt, rpc_authflavor_t flavor)
 	auth->au_flavor = flavor;
 	auth->au_flavor = flavor;
 	atomic_set(&auth->au_count, 1);
 	atomic_set(&auth->au_count, 1);
 
 
-	err = rpcauth_init_credcache(auth, GSS_CRED_EXPIRE);
-	if (err)
-		goto err_put_mech;
-
 	gss_auth->dentry = rpc_mkpipe(clnt->cl_dentry, gss_auth->mech->gm_name,
 	gss_auth->dentry = rpc_mkpipe(clnt->cl_dentry, gss_auth->mech->gm_name,
 			clnt, &gss_upcall_ops, RPC_PIPE_WAIT_FOR_OPEN);
 			clnt, &gss_upcall_ops, RPC_PIPE_WAIT_FOR_OPEN);
 	if (IS_ERR(gss_auth->dentry)) {
 	if (IS_ERR(gss_auth->dentry)) {
@@ -647,7 +643,13 @@ gss_create(struct rpc_clnt *clnt, rpc_authflavor_t flavor)
 		goto err_put_mech;
 		goto err_put_mech;
 	}
 	}
 
 
+	err = rpcauth_init_credcache(auth, GSS_CRED_EXPIRE);
+	if (err)
+		goto err_unlink_pipe;
+
 	return auth;
 	return auth;
+err_unlink_pipe:
+	rpc_unlink(gss_auth->dentry);
 err_put_mech:
 err_put_mech:
 	gss_mech_put(gss_auth->mech);
 	gss_mech_put(gss_auth->mech);
 err_free:
 err_free: