gssEapAllocContext(OM_uint32 *minor,
gss_ctx_id_t *pCtx)
{
+ OM_uint32 tmpMinor;
gss_ctx_id_t ctx;
assert(*pCtx == GSS_C_NO_CONTEXT);
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;
{
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;
}
-