gss: Use the 'gss_mo' in each mech to find mech_attrs (needed by SPNEGO)

This commit is contained in:
Nicolas Williams
2025-11-15 13:46:36 -06:00
parent b6c3116400
commit b0c925797a

View File

@@ -103,15 +103,29 @@ gss_mo_get(gss_const_OID mech, gss_const_OID option, gss_buffer_t value)
return GSS_S_UNAVAILABLE;
}
static void
add_all_mo(gssapi_mech_interface m, gss_OID_set *options, OM_uint32 mask)
static OM_uint32
add_all_mo(OM_uint32 *minor_status,
gssapi_mech_interface m,
gss_OID_set *options,
OM_uint32 mask)
{
OM_uint32 minor;
OM_uint32 maj;
size_t n;
for (n = 0; n < m->gm_mo_num; n++)
if ((m->gm_mo[n].flags & mask) == mask)
gss_add_oid_set_member(&minor, m->gm_mo[n].option, options);
if (*options == GSS_C_NO_OID_SET) {
maj = gss_create_empty_oid_set(minor_status, options);
if (maj != GSS_S_COMPLETE)
return maj;
}
for (n = 0; n < m->gm_mo_num; n++) {
if ((m->gm_mo[n].flags & mask) == mask) {
maj = gss_add_oid_set_member(minor_status, m->gm_mo[n].option,
options);
if (maj != GSS_S_COMPLETE)
return maj;
}
}
return GSS_S_COMPLETE;
}
GSSAPI_LIB_FUNCTION void GSSAPI_LIB_CALL
@@ -132,7 +146,7 @@ gss_mo_list(gss_const_OID mech, gss_OID_set *options)
if (major != GSS_S_COMPLETE)
return;
add_all_mo(m, options, 0);
(void) add_all_mo(&minor, m, options, 0);
}
GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL
@@ -472,6 +486,10 @@ gss_indicate_mechs_by_attrs(OM_uint32 * minor_status,
&known_mech_attrs);
if (GSS_ERROR(major))
continue;
} else {
major = add_all_mo(minor_status, mi, &mech_attrs, GSS_MO_MA);
if (major != GSS_S_COMPLETE)
continue;
}
/*
@@ -542,7 +560,7 @@ gss_inquire_attrs_for_mech(OM_uint32 * minor_status,
} else {
major = gss_create_empty_oid_set(minor_status, mech_attr);
if (major == GSS_S_COMPLETE)
add_all_mo(m, mech_attr, GSS_MO_MA);
add_all_mo(minor_status, m, mech_attr, GSS_MO_MA);
}
if (GSS_ERROR(major))
return major;
@@ -562,11 +580,14 @@ gss_inquire_attrs_for_mech(OM_uint32 * minor_status,
_gss_load_mech();
HEIM_TAILQ_FOREACH(m, &_gss_mechs, gm_link)
add_all_mo(&m->gm_mech, known_mech_attrs, GSS_MO_MA);
HEIM_TAILQ_FOREACH(m, &_gss_mechs, gm_link) {
major = add_all_mo(minor_status, &m->gm_mech, known_mech_attrs,
GSS_MO_MA);
if (major != GSS_S_COMPLETE)
return major;
}
}
return GSS_S_COMPLETE;
}