Skip to content

Commit

Permalink
RPCSEC_GSS: Fix an Oopsable condition when creating/destroying pipefs…
Browse files Browse the repository at this point in the history
… objects

If an error condition occurs on rpc_pipefs creation, or the user mounts
rpc_pipefs and then unmounts it, then the dentries in struct gss_auth
need to be reset to NULL so that a second call to gss_pipes_dentries_destroy
doesn't try to free them again.

Signed-off-by: Trond Myklebust <[email protected]>
  • Loading branch information
Trond Myklebust authored and Trond Myklebust committed Aug 30, 2013
1 parent e726340 commit 6b2fddd
Showing 1 changed file with 20 additions and 12 deletions.
32 changes: 20 additions & 12 deletions net/sunrpc/auth_gss/auth_gss.c
Original file line number Diff line number Diff line change
Expand Up @@ -796,37 +796,45 @@ static void gss_pipes_dentries_destroy(struct rpc_auth *auth)
struct gss_auth *gss_auth;

gss_auth = container_of(auth, struct gss_auth, rpc_auth);
if (gss_auth->pipe[0]->dentry)
if (gss_auth->pipe[0]->dentry) {
rpc_unlink(gss_auth->pipe[0]->dentry);
if (gss_auth->pipe[1]->dentry)
gss_auth->pipe[0]->dentry = NULL;
}
if (gss_auth->pipe[1]->dentry) {
rpc_unlink(gss_auth->pipe[1]->dentry);
gss_auth->pipe[1]->dentry = NULL;
}
}

static int gss_pipes_dentries_create(struct rpc_auth *auth)
{
int err;
struct gss_auth *gss_auth;
struct rpc_clnt *clnt;
struct dentry *dentry;

gss_auth = container_of(auth, struct gss_auth, rpc_auth);
clnt = gss_auth->client;

gss_auth->pipe[1]->dentry = rpc_mkpipe_dentry(clnt->cl_dentry,
"gssd",
clnt, gss_auth->pipe[1]);
if (IS_ERR(gss_auth->pipe[1]->dentry))
return PTR_ERR(gss_auth->pipe[1]->dentry);
gss_auth->pipe[0]->dentry = rpc_mkpipe_dentry(clnt->cl_dentry,
gss_auth->mech->gm_name,
clnt, gss_auth->pipe[0]);
if (IS_ERR(gss_auth->pipe[0]->dentry)) {
err = PTR_ERR(gss_auth->pipe[0]->dentry);
dentry = rpc_mkpipe_dentry(clnt->cl_dentry, "gssd",
clnt, gss_auth->pipe[1]);
if (IS_ERR(dentry)) {
err = PTR_ERR(dentry);
goto err;
}
gss_auth->pipe[1]->dentry = dentry;
dentry = rpc_mkpipe_dentry(clnt->cl_dentry, gss_auth->mech->gm_name,
clnt, gss_auth->pipe[0]);
if (IS_ERR(dentry)) {
err = PTR_ERR(dentry);
goto err_unlink_pipe_1;
}
return 0;

err_unlink_pipe_1:
rpc_unlink(gss_auth->pipe[1]->dentry);
gss_auth->pipe[1]->dentry = NULL;
err:
return err;
}

Expand Down

0 comments on commit 6b2fddd

Please sign in to comment.