gss_inquire_name stub
[mech_eap.orig] / util_context.c
index 44fc866..b6dec71 100644 (file)
@@ -36,6 +36,7 @@ OM_uint32
 gssEapAllocContext(OM_uint32 *minor,
                    gss_ctx_id_t *pCtx)
 {
+    OM_uint32 tmpMinor;
     gss_ctx_id_t ctx;
 
     assert(*pCtx == GSS_C_NO_CONTEXT);
@@ -46,6 +47,12 @@ gssEapAllocContext(OM_uint32 *minor,
         return GSS_S_FAILURE;
     }
 
+    if (GSSEAP_MUTEX_INIT(&ctx->mutex) != 0) {
+        *minor = errno;
+        gssEapReleaseContext(&tmpMinor, &ctx);
+        return GSS_S_FAILURE;
+    }
+
     *pCtx = ctx;
 
     return GSS_S_COMPLETE;
@@ -69,32 +76,32 @@ gssEapReleaseContext(OM_uint32 *minor,
 {
     OM_uint32 major, tmpMinor;
     gss_ctx_id_t ctx = *pCtx;
+    krb5_context krbContext = NULL;
 
     if (ctx == GSS_C_NO_CONTEXT) {
         return GSS_S_COMPLETE;
     }
 
+    gssEapKerberosInit(&tmpMinor, &krbContext);
+
     if (CTX_IS_INITIATOR(ctx)) {
         releaseInitiatorContext(&ctx->initiatorCtx);
     } else {
         releaseAcceptorContext(&ctx->acceptorCtx);
     }
 
-    if (ctx->encryptionKey != NULL) {
-        krb5_free_keyblock(ctx->kerberosCtx, ctx->encryptionKey);
-    }
-
-    if (ctx->kerberosCtx != NULL) {
-        krb5_free_context(ctx->kerberosCtx);
-    }
-
+    krb5_free_keyblock_contents(krbContext, &ctx->rfc3961Key);
     gssEapReleaseName(&tmpMinor, &ctx->initiatorName);
     gssEapReleaseName(&tmpMinor, &ctx->acceptorName);
+    gss_release_oid(&tmpMinor, &ctx->mechanismUsed);
+    sequenceFree(ctx->seqState);
+
+    GSSEAP_MUTEX_DESTROY(&ctx->mutex);
 
     memset(ctx, 0, sizeof(*ctx));
     GSSEAP_FREE(ctx);
     *pCtx = GSS_C_NO_CONTEXT;
 
+    *minor = 0;
     return GSS_S_COMPLETE;
 }
-