heimdal: import heimdal's trunk svn rev 23697 + lorikeet-heimdal patches
[metze/samba/wip.git] / source / heimdal / lib / gssapi / mech / gss_accept_sec_context.c
index a6b1ded5cad50141e959fab969f8903432ebd462..5fa102193ecd9816d298dfa5f8f7754d72fdf9de 100644 (file)
@@ -27,7 +27,7 @@
  */
 
 #include "mech_locl.h"
-RCSID("$Id: gss_accept_sec_context.c 22071 2007-11-14 20:04:50Z lha $");
+RCSID("$Id$");
 
 static OM_uint32
 parse_header(const gss_buffer_t input_token, gss_OID mech_oid)
@@ -151,14 +151,13 @@ OM_uint32 gss_accept_sec_context(OM_uint32 *minor_status,
     OM_uint32 *time_rec,
     gss_cred_id_t *delegated_cred_handle)
 {
-       OM_uint32 major_status, mech_ret_flags;
+       OM_uint32 major_status, mech_ret_flags, junk;
        gssapi_mech_interface m;
        struct _gss_context *ctx = (struct _gss_context *) *context_handle;
        struct _gss_cred *cred = (struct _gss_cred *) acceptor_cred_handle;
        struct _gss_mechanism_cred *mc;
        gss_cred_id_t acceptor_mc, delegated_mc;
        gss_name_t src_mn;
-       int allocated_ctx;
 
        *minor_status = 0;
        if (src_name)
@@ -200,18 +199,19 @@ OM_uint32 gss_accept_sec_context(OM_uint32 *minor_status,
                        free(ctx);
                        return (GSS_S_BAD_MECH);
                }
-               allocated_ctx = 1;
+               *context_handle = (gss_ctx_id_t) ctx;
        } else {
                m = ctx->gc_mech;
-               allocated_ctx = 0;
        }
 
        if (cred) {
                SLIST_FOREACH(mc, &cred->gc_mc, gmc_link)
                        if (mc->gmc_mech == m)
                                break;
-               if (!mc)
+               if (!mc) {
+                       gss_delete_sec_context(&junk, context_handle, NULL);
                        return (GSS_S_BAD_MECH);
+               }
                acceptor_mc = mc->gmc_cred;
        } else {
                acceptor_mc = GSS_C_NO_CREDENTIAL;
@@ -234,6 +234,7 @@ OM_uint32 gss_accept_sec_context(OM_uint32 *minor_status,
            major_status != GSS_S_CONTINUE_NEEDED)
        {
                _gss_mg_error(m, major_status, *minor_status);
+               gss_delete_sec_context(&junk, context_handle, NULL);
                return (major_status);
        }
 
@@ -245,11 +246,12 @@ OM_uint32 gss_accept_sec_context(OM_uint32 *minor_status,
 
                if (!name) {
                        m->gm_release_name(minor_status, &src_mn);
+                       gss_delete_sec_context(&junk, context_handle, NULL);
                        return (GSS_S_FAILURE);
                }
                *src_name = (gss_name_t) name;
        } else if (src_mn) {
-           m->gm_release_name(minor_status, &src_mn);
+               m->gm_release_name(minor_status, &src_mn);
        }
 
        if (mech_ret_flags & GSS_C_DELEG_FLAG) {
@@ -263,6 +265,7 @@ OM_uint32 gss_accept_sec_context(OM_uint32 *minor_status,
                        dcred = malloc(sizeof(struct _gss_cred));
                        if (!dcred) {
                                *minor_status = ENOMEM;
+                               gss_delete_sec_context(&junk, context_handle, NULL);
                                return (GSS_S_FAILURE);
                        }
                        SLIST_INIT(&dcred->gc_mc);
@@ -270,6 +273,7 @@ OM_uint32 gss_accept_sec_context(OM_uint32 *minor_status,
                        if (!dmc) {
                                free(dcred);
                                *minor_status = ENOMEM;
+                               gss_delete_sec_context(&junk, context_handle, NULL);
                                return (GSS_S_FAILURE);
                        }
                        dmc->gmc_mech = m;
@@ -283,6 +287,5 @@ OM_uint32 gss_accept_sec_context(OM_uint32 *minor_status,
 
        if (ret_flags)
            *ret_flags = mech_ret_flags;
-       *context_handle = (gss_ctx_id_t) ctx;
        return (major_status);
 }