diff --git a/lib/gssapi/mech/gss_mo.c b/lib/gssapi/mech/gss_mo.c index 08cb43d37..aa55821b2 100644 --- a/lib/gssapi/mech/gss_mo.c +++ b/lib/gssapi/mech/gss_mo.c @@ -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; }