From: Greg Hudson Date: Tue, 19 Nov 2019 20:02:04 +0000 (-0500) Subject: Factor out mechglue union context creation X-Git-Tag: krb5-1.18-beta1~29 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F1003%2Fhead;p=thirdparty%2Fkrb5.git Factor out mechglue union context creation Add a helper function gssint_create_union_context() and use it in the four mechglue functions which create a context. In gss_import_sec_context(), create the union context later and eliminate the cleanup label. --- diff --git a/src/lib/gssapi/mechglue/g_accept_sec_context.c b/src/lib/gssapi/mechglue/g_accept_sec_context.c index 8e63a9b356..4f2a66e26a 100644 --- a/src/lib/gssapi/mechglue/g_accept_sec_context.c +++ b/src/lib/gssapi/mechglue/g_accept_sec_context.c @@ -232,20 +232,10 @@ gss_cred_id_t * d_cred; /* Now create a new context if we didn't get one. */ if (*context_handle == GSS_C_NO_CONTEXT) { - status = GSS_S_FAILURE; - union_ctx_id = (gss_union_ctx_id_t) - malloc(sizeof(gss_union_ctx_id_desc)); - if (!union_ctx_id) - return (GSS_S_FAILURE); - - union_ctx_id->loopback = union_ctx_id; - union_ctx_id->internal_ctx_id = GSS_C_NO_CONTEXT; - status = generic_gss_copy_oid(&temp_minor_status, selected_mech, - &union_ctx_id->mech_type); - if (status != GSS_S_COMPLETE) { - free(union_ctx_id); + status = gssint_create_union_context(minor_status, selected_mech, + &union_ctx_id); + if (status != GSS_S_COMPLETE) return (status); - } } /* diff --git a/src/lib/gssapi/mechglue/g_glue.c b/src/lib/gssapi/mechglue/g_glue.c index 4cd2e8f8eb..dfef49e0c1 100644 --- a/src/lib/gssapi/mechglue/g_glue.c +++ b/src/lib/gssapi/mechglue/g_glue.c @@ -758,3 +758,31 @@ gssint_create_copy_buffer(srcBuf, destBuf, addNullChar) return (GSS_S_COMPLETE); } /* ****** gssint_create_copy_buffer ****** */ + +OM_uint32 +gssint_create_union_context(OM_uint32 *minor, gss_const_OID mech_oid, + gss_union_ctx_id_t *ctx_out) +{ + OM_uint32 status; + gss_union_ctx_id_t ctx; + + *ctx_out = NULL; + + ctx = calloc(1, sizeof(*ctx)); + if (ctx == NULL) { + *minor = ENOMEM; + return GSS_S_FAILURE; + } + + status = generic_gss_copy_oid(minor, mech_oid, &ctx->mech_type); + if (status != GSS_S_COMPLETE) { + free(ctx); + return status; + } + + ctx->loopback = ctx; + ctx->internal_ctx_id = GSS_C_NO_CONTEXT; + + *ctx_out = ctx; + return GSS_S_COMPLETE; +} diff --git a/src/lib/gssapi/mechglue/g_imp_sec_context.c b/src/lib/gssapi/mechglue/g_imp_sec_context.c index a0e2d71221..6315201a5f 100644 --- a/src/lib/gssapi/mechglue/g_imp_sec_context.c +++ b/src/lib/gssapi/mechglue/g_imp_sec_context.c @@ -97,10 +97,6 @@ gss_ctx_id_t * context_handle; /* Initial value needed below. */ status = GSS_S_FAILURE; - ctx = (gss_union_ctx_id_t) malloc(sizeof(gss_union_ctx_id_desc)); - if (!ctx) - return (GSS_S_FAILURE); - if (interprocess_token->length >= sizeof (OM_uint32)) { p = interprocess_token->value; length = (OM_uint32)*p++; @@ -111,7 +107,6 @@ gss_ctx_id_t * context_handle; if (length == 0 || length > (interprocess_token->length - sizeof (OM_uint32))) { - free(ctx); return (GSS_S_CALL_BAD_STRUCTURE | GSS_S_DEFECTIVE_TOKEN); } @@ -131,24 +126,18 @@ gss_ctx_id_t * context_handle; status = gssint_select_mech_type(minor_status, &token_mech, &selected_mech); if (status != GSS_S_COMPLETE) - goto error_out; + return status; mech = gssint_get_mechanism(selected_mech); - if (!mech) { - status = GSS_S_BAD_MECH; - goto error_out; - } + if (!mech) + return GSS_S_BAD_MECH; if (!mech->gssspi_import_sec_context_by_mech && - !mech->gss_import_sec_context) { - status = GSS_S_UNAVAILABLE; - goto error_out; - } + !mech->gss_import_sec_context) + return GSS_S_UNAVAILABLE; - if (generic_gss_copy_oid(minor_status, selected_mech, - &ctx->mech_type) != GSS_S_COMPLETE) { - status = GSS_S_FAILURE; - goto error_out; - } + status = gssint_create_union_context(minor_status, selected_mech, &ctx); + if (status != GSS_S_COMPLETE) + return status; if (mech->gssspi_import_sec_context_by_mech) { public_mech = gssint_get_public_oid(selected_mech); @@ -160,15 +149,12 @@ gss_ctx_id_t * context_handle; } if (status == GSS_S_COMPLETE) { ctx->internal_ctx_id = mctx; - ctx->loopback = ctx; *context_handle = (gss_ctx_id_t)ctx; return (GSS_S_COMPLETE); } map_error(minor_status, mech); free(ctx->mech_type->elements); free(ctx->mech_type); - -error_out: free(ctx); return status; } diff --git a/src/lib/gssapi/mechglue/g_init_sec_context.c b/src/lib/gssapi/mechglue/g_init_sec_context.c index cf10192334..a58074c007 100644 --- a/src/lib/gssapi/mechglue/g_init_sec_context.c +++ b/src/lib/gssapi/mechglue/g_init_sec_context.c @@ -184,20 +184,10 @@ OM_uint32 * time_rec; */ if(*context_handle == GSS_C_NO_CONTEXT) { - status = GSS_S_FAILURE; - union_ctx_id = (gss_union_ctx_id_t) - malloc(sizeof(gss_union_ctx_id_desc)); - if (union_ctx_id == NULL) + status = gssint_create_union_context(minor_status, selected_mech, + &union_ctx_id); + if (status != GSS_S_COMPLETE) goto end; - - if (generic_gss_copy_oid(&temp_minor_status, selected_mech, - &union_ctx_id->mech_type) != GSS_S_COMPLETE) { - free(union_ctx_id); - goto end; - } - - /* copy the supplied context handle */ - union_ctx_id->internal_ctx_id = GSS_C_NO_CONTEXT; } else { union_ctx_id = (gss_union_ctx_id_t)*context_handle; if (union_ctx_id->internal_ctx_id == GSS_C_NO_CONTEXT) { @@ -248,7 +238,6 @@ OM_uint32 * time_rec; free(union_ctx_id); } } else if (*context_handle == GSS_C_NO_CONTEXT) { - union_ctx_id->loopback = union_ctx_id; *context_handle = (gss_ctx_id_t)union_ctx_id; } diff --git a/src/lib/gssapi/mechglue/g_set_context_option.c b/src/lib/gssapi/mechglue/g_set_context_option.c index c3561316db..eb67a9ebf2 100644 --- a/src/lib/gssapi/mechglue/g_set_context_option.c +++ b/src/lib/gssapi/mechglue/g_set_context_option.c @@ -71,37 +71,23 @@ gss_set_sec_context_option (OM_uint32 *minor_status, &internal_ctx, desired_object, value); - if (status == GSS_S_COMPLETE) { - if (ctx == NULL && internal_ctx != GSS_C_NO_CONTEXT) { - /* Allocate a union context handle to wrap new context */ - ctx = (gss_union_ctx_id_t)malloc(sizeof(*ctx)); - if (ctx == NULL) { - *minor_status = ENOMEM; - gssint_delete_internal_sec_context(&minor, - &mech->mech_type, - &internal_ctx, - GSS_C_NO_BUFFER); - return GSS_S_FAILURE; - } - - status = generic_gss_copy_oid(minor_status, - &mech->mech_type, - &ctx->mech_type); - if (status != GSS_S_COMPLETE) { - gssint_delete_internal_sec_context(&minor, - ctx->mech_type, - &internal_ctx, - GSS_C_NO_BUFFER); - free(ctx); - return status; - } + if (status != GSS_S_COMPLETE) { + map_error(minor_status, mech); + return status; + } - ctx->loopback = ctx; - ctx->internal_ctx_id = internal_ctx; - *context_handle = (gss_ctx_id_t)ctx; + if (ctx == NULL && internal_ctx != GSS_C_NO_CONTEXT) { + status = gssint_create_union_context(minor_status, &mech->mech_type, + &ctx); + if (status != GSS_S_COMPLETE) { + gssint_delete_internal_sec_context(&minor, ctx->mech_type, + &internal_ctx, GSS_C_NO_BUFFER); + return status; } - } else - map_error(minor_status, mech); - return status; + ctx->internal_ctx_id = internal_ctx; + *context_handle = (gss_ctx_id_t)ctx; + } + + return GSS_S_COMPLETE; } diff --git a/src/lib/gssapi/mechglue/mglueP.h b/src/lib/gssapi/mechglue/mglueP.h index 2b00987e6b..c296354d5c 100644 --- a/src/lib/gssapi/mechglue/mglueP.h +++ b/src/lib/gssapi/mechglue/mglueP.h @@ -769,6 +769,12 @@ OM_uint32 gssint_create_copy_buffer( int /* NULL terminate buffer ? */ ); +OM_uint32 gssint_create_union_context( + OM_uint32 *minor, /* minor_status */ + gss_const_OID, /* mech_oid */ + gss_union_ctx_id_t * /* ctx_out */ +); + OM_uint32 gssint_copy_oid_set( OM_uint32 *, /* minor_status */ const gss_OID_set_desc * const, /* oid set */