gss: remove SPNEGO name wrappers

Wrapping GSS names at the SPNEGO level serves no purpose; remove it and return
mechglue names directly. This required a small change to the NTLM mechanism to
allow NULL names to be passed to its release name function.
This commit is contained in:
Luke Howard
2020-01-02 16:30:42 +11:00
parent e80248ed36
commit ae5c60286a
6 changed files with 30 additions and 215 deletions

View File

@@ -269,21 +269,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_compare_name
int * name_equal
)
{
spnego_name n1 = (spnego_name)name1;
spnego_name n2 = (spnego_name)name2;
*name_equal = 0;
if (!gss_oid_equal(n1->type, n2->type))
return GSS_S_COMPLETE;
if (n1->value.length != n2->value.length)
return GSS_S_COMPLETE;
if (memcmp(n1->value.value, n2->value.value, n2->value.length) != 0)
return GSS_S_COMPLETE;
*name_equal = 1;
return GSS_S_COMPLETE;
return gss_compare_name(minor_status, name1, name2, name_equal);
}
OM_uint32 GSSAPI_CALLCONV _gss_spnego_display_name
@@ -293,14 +279,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_display_name
gss_OID * output_name_type
)
{
spnego_name name = (spnego_name)input_name;
*minor_status = 0;
if (name == NULL || name->mech == GSS_C_NO_NAME)
return GSS_S_FAILURE;
return gss_display_name(minor_status, name->mech,
return gss_display_name(minor_status, input_name,
output_name_buffer, output_name_type);
}
@@ -311,33 +290,8 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_import_name
gss_name_t * output_name
)
{
spnego_name name;
OM_uint32 maj_stat;
*minor_status = 0;
name = calloc(1, sizeof(*name));
if (name == NULL) {
*minor_status = ENOMEM;
return GSS_S_FAILURE;
}
maj_stat = _gss_intern_oid(minor_status, name_type, &name->type);
if (maj_stat) {
free(name);
return GSS_S_FAILURE;
}
maj_stat = _gss_copy_buffer(minor_status, name_buffer, &name->value);
if (maj_stat) {
gss_name_t rname = (gss_name_t)name;
_gss_spnego_release_name(minor_status, &rname);
return GSS_S_FAILURE;
}
name->mech = GSS_C_NO_NAME;
*output_name = (gss_name_t)name;
return GSS_S_COMPLETE;
return gss_import_name(minor_status, name_buffer,
name_type, output_name);
}
OM_uint32 GSSAPI_CALLCONV _gss_spnego_export_name
@@ -346,17 +300,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_export_name
gss_buffer_t exported_name
)
{
spnego_name name;
*minor_status = 0;
if (input_name == GSS_C_NO_NAME)
return GSS_S_BAD_NAME;
name = (spnego_name)input_name;
if (name->mech == GSS_C_NO_NAME)
return GSS_S_BAD_NAME;
return gss_export_name(minor_status, name->mech, exported_name);
return gss_export_name(minor_status, input_name, exported_name);
}
OM_uint32 GSSAPI_CALLCONV _gss_spnego_release_name
@@ -364,19 +308,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_release_name
gss_name_t * input_name
)
{
*minor_status = 0;
if (*input_name != GSS_C_NO_NAME) {
OM_uint32 junk;
spnego_name name = (spnego_name)*input_name;
gss_release_buffer(&junk, &name->value);
if (name->mech != GSS_C_NO_NAME)
gss_release_name(&junk, &name->mech);
free(name);
*input_name = GSS_C_NO_NAME;
}
return GSS_S_COMPLETE;
return gss_release_name(minor_status, input_name);
}
OM_uint32 GSSAPI_CALLCONV _gss_spnego_inquire_context (
@@ -392,8 +324,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_inquire_context (
)
{
gssspnego_ctx ctx;
OM_uint32 maj_stat, junk;
gss_name_t src_mn, targ_mn;
OM_uint32 maj_stat;
*minor_status = 0;
@@ -407,43 +338,15 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_inquire_context (
maj_stat = gss_inquire_context(minor_status,
ctx->negotiated_ctx_id,
&src_mn,
&targ_mn,
src_name,
targ_name,
lifetime_rec,
mech_type,
ctx_flags,
locally_initiated,
open_context);
if (maj_stat != GSS_S_COMPLETE)
return maj_stat;
if (src_name) {
spnego_name name = calloc(1, sizeof(*name));
if (name == NULL)
goto enomem;
name->mech = src_mn;
*src_name = (gss_name_t)name;
} else
gss_release_name(&junk, &src_mn);
if (targ_name) {
spnego_name name = calloc(1, sizeof(*name));
if (name == NULL) {
gss_release_name(minor_status, src_name);
goto enomem;
}
name->mech = targ_mn;
*targ_name = (gss_name_t)name;
} else
gss_release_name(&junk, &targ_mn);
return GSS_S_COMPLETE;
enomem:
gss_release_name(&junk, &targ_mn);
gss_release_name(&junk, &src_mn);
*minor_status = ENOMEM;
return GSS_S_FAILURE;
return maj_stat;
}
OM_uint32 GSSAPI_CALLCONV _gss_spnego_wrap_size_limit (