diff options
author | Greg Hudson <ghudson@mit.edu> | 2012-08-11 00:16:25 -0400 |
---|---|---|
committer | Greg Hudson <ghudson@mit.edu> | 2012-08-11 00:28:33 -0400 |
commit | 1870feda057e24826f505eb5f3151aad3041ab1e (patch) | |
tree | b1b0368ccaf818979d541a56e711572c66ac5c25 /src | |
parent | b0edf38aafe3a365821cae4874e4608f95e28896 (diff) | |
download | krb5-1870feda057e24826f505eb5f3151aad3041ab1e.tar.gz krb5-1870feda057e24826f505eb5f3151aad3041ab1e.tar.xz krb5-1870feda057e24826f505eb5f3151aad3041ab1e.zip |
Stop misusing gss_release_buffer in libgssrpc
Use free() instead of gss_release_buffer() when freeing buffers in
libgssrpc which weren't constructed by GSSAPI. This mixing is
harmless in normal configurations (since libgssrpc is only used on
Unix), but fails with DEBUG_GSSALLOC.
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/rpc/auth_gss.c | 18 | ||||
-rw-r--r-- | src/lib/rpc/auth_gssapi.c | 4 | ||||
-rw-r--r-- | src/lib/rpc/authgss_prot.c | 4 |
3 files changed, 11 insertions, 15 deletions
diff --git a/src/lib/rpc/auth_gss.c b/src/lib/rpc/auth_gss.c index 6e61179151..ab161c17d9 100644 --- a/src/lib/rpc/auth_gss.c +++ b/src/lib/rpc/auth_gss.c @@ -432,7 +432,8 @@ authgss_refresh(AUTH *auth, struct rpc_msg *msg) log_status("gss_init_sec_context", maj_stat, min_stat); if (recv_tokenp != GSS_C_NO_BUFFER) { - gss_release_buffer(&min_stat, &gr.gr_token); + free(gr.gr_token.value); + gr.gr_token.value = NULL; recv_tokenp = GSS_C_NO_BUFFER; } if (maj_stat != GSS_S_COMPLETE && @@ -459,9 +460,7 @@ authgss_refresh(AUTH *auth, struct rpc_msg *msg) break; if (gr.gr_ctx.length != 0) { - if (gd->gc.gc_ctx.value) - gss_release_buffer(&min_stat, - &gd->gc.gc_ctx); + free(gd->gc.gc_ctx.value); gd->gc.gc_ctx = gr.gr_ctx; } if (gr.gr_token.length != 0) { @@ -490,17 +489,18 @@ authgss_refresh(AUTH *auth, struct rpc_msg *msg) log_debug("authgss_refresh: GSS_S_COMPLETE: calling verify_mic"); maj_stat = gss_verify_mic(&min_stat,gd->ctx, &bufin, &bufout, &qop_state); + free(gd->gc_wire_verf.value); + gd->gc_wire_verf.length = 0; + gd->gc_wire_verf.value = NULL; if (maj_stat != GSS_S_COMPLETE || qop_state != gd->sec.qop) { log_status("gss_verify_mic", maj_stat, min_stat); - gss_release_buffer(&min_stat, &gd->gc_wire_verf); if (maj_stat == GSS_S_CONTEXT_EXPIRED) { gd->established = FALSE; authgss_destroy_context(auth); } return (FALSE); } - gss_release_buffer(&min_stat, &gd->gc_wire_verf); gd->established = TRUE; gd->inprogress = FALSE; gd->gc.gc_proc = RPCSEC_GSS_DATA; @@ -513,9 +513,7 @@ authgss_refresh(AUTH *auth, struct rpc_msg *msg) /* End context negotiation loop. */ if (gd->gc.gc_proc != RPCSEC_GSS_DATA) { log_debug("authgss_refresh: returning ERROR (gc_proc %d)", gd->gc.gc_proc); - if (gr.gr_token.length != 0) - gss_release_buffer(&min_stat, &gr.gr_token); - + free(gr.gr_token.value); authgss_destroy(auth); auth = NULL; rpc_createerr.cf_stat = RPC_AUTHERROR; @@ -565,7 +563,7 @@ authgss_destroy_context(AUTH *auth) clnt_sperror(gd->clnt, "authgss_destroy_context")); } - gss_release_buffer(&min_stat, &gd->gc.gc_ctx); + free(gd->gc.gc_ctx.value); /* XXX ANDROS check size of context - should be 8 */ memset(&gd->gc.gc_ctx, 0, sizeof(gd->gc.gc_ctx)); } diff --git a/src/lib/rpc/auth_gssapi.c b/src/lib/rpc/auth_gssapi.c index e7a1f8b00b..64a6b5b791 100644 --- a/src/lib/rpc/auth_gssapi.c +++ b/src/lib/rpc/auth_gssapi.c @@ -743,9 +743,7 @@ skip_call: gssstat, minor_stat)); } - if (AUTH_PRIVATE(auth)->client_handle.length != 0) - gss_release_buffer(&minor_stat, - &AUTH_PRIVATE(auth)->client_handle); + free(AUTH_PRIVATE(auth)->client_handle.value); #if 0 PRINTF(("gssapi_destroy: calling GSSAPI_EXIT\n")); diff --git a/src/lib/rpc/authgss_prot.c b/src/lib/rpc/authgss_prot.c index 01f16ea55d..a5a587f905 100644 --- a/src/lib/rpc/authgss_prot.c +++ b/src/lib/rpc/authgss_prot.c @@ -212,7 +212,7 @@ xdr_rpc_gss_unwrap_data(XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr, /* Verify checksum and QOP. */ maj_stat = gss_verify_mic(&min_stat, ctx, &databuf, &wrapbuf, &qop_state); - gss_release_buffer(&min_stat, &wrapbuf); + free(wrapbuf.value); if (maj_stat != GSS_S_COMPLETE || qop_state != qop) { gss_release_buffer(&min_stat, &databuf); @@ -230,7 +230,7 @@ xdr_rpc_gss_unwrap_data(XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr, maj_stat = gss_unwrap(&min_stat, ctx, &wrapbuf, &databuf, &conf_state, &qop_state); - gss_release_buffer(&min_stat, &wrapbuf); + free(wrapbuf.value); /* Verify encryption and QOP. */ if (maj_stat != GSS_S_COMPLETE || qop_state != qop || |