Skip to content

Commit

Permalink
sunrpc: fix code that makes auth_gss send destroy_cred message (try #2)
Browse files Browse the repository at this point in the history
There's a bit of a chicken and egg problem when it comes to destroying
auth_gss credentials. When we destroy the last instance of a GSSAPI RPC
credential, we should send a NULL RPC call with a GSS procedure of
RPCSEC_GSS_DESTROY to hint to the server that it can destroy those
creds.

This isn't happening because we're setting clearing the uptodate bit on
the credentials and then setting the operations to the gss_nullops. When
we go to do the RPC call, we try to refresh the creds. That fails with
-EACCES and the call fails.

Fix this by not clearing the UPTODATE bit for the credentials and adding
a new crdestroy op for gss_nullops that just tears down the cred without
trying to destroy the context.

The only difference between this patch and the first one is the removal
of some minor formatting deltas.

Signed-off-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
  • Loading branch information
Jeff Layton authored and Trond Myklebust committed Dec 23, 2008
1 parent 64672d5 commit 6dcd392
Showing 1 changed file with 12 additions and 5 deletions.
17 changes: 12 additions & 5 deletions net/sunrpc/auth_gss/auth_gss.c
Original file line number Diff line number Diff line change
Expand Up @@ -693,7 +693,7 @@ gss_destroying_context(struct rpc_cred *cred)
struct rpc_task *task;

if (gss_cred->gc_ctx == NULL ||
test_and_clear_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags) == 0)
test_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags) == 0)
return 0;

gss_cred->gc_ctx->gc_proc = RPC_GSS_PROC_DESTROY;
Expand Down Expand Up @@ -757,21 +757,28 @@ gss_free_cred_callback(struct rcu_head *head)
}

static void
gss_destroy_cred(struct rpc_cred *cred)
gss_destroy_nullcred(struct rpc_cred *cred)
{
struct gss_cred *gss_cred = container_of(cred, struct gss_cred, gc_base);
struct gss_auth *gss_auth = container_of(cred->cr_auth, struct gss_auth, rpc_auth);
struct gss_cl_ctx *ctx = gss_cred->gc_ctx;

if (gss_destroying_context(cred))
return;
rcu_assign_pointer(gss_cred->gc_ctx, NULL);
call_rcu(&cred->cr_rcu, gss_free_cred_callback);
if (ctx)
gss_put_ctx(ctx);
kref_put(&gss_auth->kref, gss_free_callback);
}

static void
gss_destroy_cred(struct rpc_cred *cred)
{

if (gss_destroying_context(cred))
return;
gss_destroy_nullcred(cred);
}

/*
* Lookup RPCSEC_GSS cred for the current process
*/
Expand Down Expand Up @@ -1324,7 +1331,7 @@ static const struct rpc_credops gss_credops = {

static const struct rpc_credops gss_nullops = {
.cr_name = "AUTH_GSS",
.crdestroy = gss_destroy_cred,
.crdestroy = gss_destroy_nullcred,
.crbind = rpcauth_generic_bind_cred,
.crmatch = gss_match,
.crmarshal = gss_marshal,
Expand Down

0 comments on commit 6dcd392

Please sign in to comment.