Delete context on failure.
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@23500 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -151,7 +151,7 @@ OM_uint32 gss_accept_sec_context(OM_uint32 *minor_status,
|
|||||||
OM_uint32 *time_rec,
|
OM_uint32 *time_rec,
|
||||||
gss_cred_id_t *delegated_cred_handle)
|
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;
|
gssapi_mech_interface m;
|
||||||
struct _gss_context *ctx = (struct _gss_context *) *context_handle;
|
struct _gss_context *ctx = (struct _gss_context *) *context_handle;
|
||||||
struct _gss_cred *cred = (struct _gss_cred *) acceptor_cred_handle;
|
struct _gss_cred *cred = (struct _gss_cred *) acceptor_cred_handle;
|
||||||
@@ -200,18 +200,19 @@ OM_uint32 gss_accept_sec_context(OM_uint32 *minor_status,
|
|||||||
free(ctx);
|
free(ctx);
|
||||||
return (GSS_S_BAD_MECH);
|
return (GSS_S_BAD_MECH);
|
||||||
}
|
}
|
||||||
allocated_ctx = 1;
|
*context_handle = (gss_ctx_id_t) ctx;
|
||||||
} else {
|
} else {
|
||||||
m = ctx->gc_mech;
|
m = ctx->gc_mech;
|
||||||
allocated_ctx = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cred) {
|
if (cred) {
|
||||||
SLIST_FOREACH(mc, &cred->gc_mc, gmc_link)
|
SLIST_FOREACH(mc, &cred->gc_mc, gmc_link)
|
||||||
if (mc->gmc_mech == m)
|
if (mc->gmc_mech == m)
|
||||||
break;
|
break;
|
||||||
if (!mc)
|
if (!mc) {
|
||||||
|
gss_delete_sec_context(&junk, context_handle, NULL);
|
||||||
return (GSS_S_BAD_MECH);
|
return (GSS_S_BAD_MECH);
|
||||||
|
}
|
||||||
acceptor_mc = mc->gmc_cred;
|
acceptor_mc = mc->gmc_cred;
|
||||||
} else {
|
} else {
|
||||||
acceptor_mc = GSS_C_NO_CREDENTIAL;
|
acceptor_mc = GSS_C_NO_CREDENTIAL;
|
||||||
@@ -234,6 +235,7 @@ OM_uint32 gss_accept_sec_context(OM_uint32 *minor_status,
|
|||||||
major_status != GSS_S_CONTINUE_NEEDED)
|
major_status != GSS_S_CONTINUE_NEEDED)
|
||||||
{
|
{
|
||||||
_gss_mg_error(m, major_status, *minor_status);
|
_gss_mg_error(m, major_status, *minor_status);
|
||||||
|
gss_delete_sec_context(&junk, context_handle, NULL);
|
||||||
return (major_status);
|
return (major_status);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -245,11 +247,12 @@ OM_uint32 gss_accept_sec_context(OM_uint32 *minor_status,
|
|||||||
|
|
||||||
if (!name) {
|
if (!name) {
|
||||||
m->gm_release_name(minor_status, &src_mn);
|
m->gm_release_name(minor_status, &src_mn);
|
||||||
|
gss_delete_sec_context(&junk, context_handle, NULL);
|
||||||
return (GSS_S_FAILURE);
|
return (GSS_S_FAILURE);
|
||||||
}
|
}
|
||||||
*src_name = (gss_name_t) name;
|
*src_name = (gss_name_t) name;
|
||||||
} else if (src_mn) {
|
} 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) {
|
if (mech_ret_flags & GSS_C_DELEG_FLAG) {
|
||||||
@@ -263,6 +266,7 @@ OM_uint32 gss_accept_sec_context(OM_uint32 *minor_status,
|
|||||||
dcred = malloc(sizeof(struct _gss_cred));
|
dcred = malloc(sizeof(struct _gss_cred));
|
||||||
if (!dcred) {
|
if (!dcred) {
|
||||||
*minor_status = ENOMEM;
|
*minor_status = ENOMEM;
|
||||||
|
gss_delete_sec_context(&junk, context_handle, NULL);
|
||||||
return (GSS_S_FAILURE);
|
return (GSS_S_FAILURE);
|
||||||
}
|
}
|
||||||
SLIST_INIT(&dcred->gc_mc);
|
SLIST_INIT(&dcred->gc_mc);
|
||||||
@@ -270,6 +274,7 @@ OM_uint32 gss_accept_sec_context(OM_uint32 *minor_status,
|
|||||||
if (!dmc) {
|
if (!dmc) {
|
||||||
free(dcred);
|
free(dcred);
|
||||||
*minor_status = ENOMEM;
|
*minor_status = ENOMEM;
|
||||||
|
gss_delete_sec_context(&junk, context_handle, NULL);
|
||||||
return (GSS_S_FAILURE);
|
return (GSS_S_FAILURE);
|
||||||
}
|
}
|
||||||
dmc->gmc_mech = m;
|
dmc->gmc_mech = m;
|
||||||
@@ -283,6 +288,5 @@ OM_uint32 gss_accept_sec_context(OM_uint32 *minor_status,
|
|||||||
|
|
||||||
if (ret_flags)
|
if (ret_flags)
|
||||||
*ret_flags = mech_ret_flags;
|
*ret_flags = mech_ret_flags;
|
||||||
*context_handle = (gss_ctx_id_t) ctx;
|
|
||||||
return (major_status);
|
return (major_status);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user