auth_gss.c | 11 ++++++++--- 1 files changed, 8 insertions(+), 3 deletions(-) diff -u --recursive --new-file linux-2.6.0-08-memleaks/net/sunrpc/auth_gss/auth_gss.c linux-2.6.0-09-refleaks/net/sunrpc/auth_gss/auth_gss.c --- linux-2.6.0-08-memleaks/net/sunrpc/auth_gss/auth_gss.c 2003-10-14 22:03:13.000000000 -0400 +++ linux-2.6.0-09-refleaks/net/sunrpc/auth_gss/auth_gss.c 2003-10-14 22:04:29.000000000 -0400 @@ -724,6 +724,7 @@ goto out_put_ctx; } p = xdr_encode_netobj(p, &bufout); + gss_put_ctx(ctx); kfree(bufout.data); return p; out_put_ctx: @@ -764,13 +765,13 @@ flav = ntohl(*p++); if ((len = ntohl(*p++)) > RPC_MAX_AUTH_SIZE) { printk("RPC: giant verf size: %ld\n", (unsigned long) len); - return NULL; + goto out_bad; } dprintk("RPC: gss_validate: verifier flavor %d, len %d\n", flav, len); if (flav != RPC_AUTH_GSS) { printk("RPC: bad verf flavor: %ld\n", (unsigned long)flav); - return NULL; + goto out_bad; } seq = htonl(task->tk_gss_seqno); bufin.data = (u8 *) &seq; @@ -779,10 +780,14 @@ bufout.len = len; if (gss_verify_mic(ctx->gc_gss_ctx, &bufin, &bufout, &qop_state) != 0) - return NULL; + goto out_bad; task->tk_auth->au_rslack = XDR_QUADLEN(len) + 2; dprintk("RPC: GSS gss_validate: gss_verify_mic succeeded.\n"); + gss_put_ctx(ctx); return p + XDR_QUADLEN(len); +out_bad: + gss_put_ctx(ctx); + return NULL; } static struct rpc_authops authgss_ops = {