]> git.ipfire.org Git - thirdparty/krb5.git/commitdiff
Factor out mechglue union context creation 1003/head
authorGreg Hudson <ghudson@mit.edu>
Tue, 19 Nov 2019 20:02:04 +0000 (15:02 -0500)
committerGreg Hudson <ghudson@mit.edu>
Tue, 19 Nov 2019 23:25:35 +0000 (18:25 -0500)
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.

src/lib/gssapi/mechglue/g_accept_sec_context.c
src/lib/gssapi/mechglue/g_glue.c
src/lib/gssapi/mechglue/g_imp_sec_context.c
src/lib/gssapi/mechglue/g_init_sec_context.c
src/lib/gssapi/mechglue/g_set_context_option.c
src/lib/gssapi/mechglue/mglueP.h

index 8e63a9b356deba86a1932e0a32cfab0f0c53edb0..4f2a66e26aa2e683c80914c9d0a986309b7375b8 100644 (file)
@@ -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);
-       }
     }
 
     /*
index 4cd2e8f8eb8c2a2fddab9290fe12e985f3767380..dfef49e0c1ef5067729e5ca5e5b9b82ec052f92f 100644 (file)
@@ -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;
+}
index a0e2d71221b6f77143919373d7cd0170116aa70c..6315201a5f953a2b34da89ced05387ce92e467d5 100644 (file)
@@ -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;
 }
index cf10192334cdeec38fe8aa9118b9d5c0d8864904..a58074c00742cce31a3fcf6d27eea48010dcbef7 100644 (file)
@@ -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;
     }
 
index c3561316db9af49472fa9651c0a9c16aa34d345b..eb67a9ebf2aa4ed685758d6c53281e4278ff2270 100644 (file)
@@ -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;
 }
index 2b00987e6bfb566ad993a2644342f6df785e6205..c296354d5cc3a2c931f789aafd7bf9224ae3ed68 100644 (file)
@@ -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 */