gss_OID_set *mech_set)
{
struct _gss_mech_switch *m;
- OM_uint32 major_status;
+ OM_uint32 major_status, junk;
gss_OID_set set;
size_t i;
if (major_status)
return (major_status);
- HEIM_SLIST_FOREACH(m, &_gss_mechs, gm_link) {
+ /* XXX We ignore ENOMEM from gss_add_oid_set_member() */
+ HEIM_TAILQ_FOREACH(m, &_gss_mechs, gm_link) {
if (m->gm_mech.gm_indicate_mechs) {
major_status = m->gm_mech.gm_indicate_mechs(
minor_status, &set);
if (major_status)
continue;
- for (i = 0; i < set->count; i++)
+ major_status = GSS_S_COMPLETE;
+ for (i = 0; i < set->count; i++) {
major_status = gss_add_oid_set_member(
minor_status, &set->elements[i], mech_set);
+ if (major_status)
+ break;
+ }
gss_release_oid_set(minor_status, &set);
} else {
major_status = gss_add_oid_set_member(
- minor_status, &m->gm_mech_oid, mech_set);
+ minor_status, m->gm_mech_oid, mech_set);
}
+ if (major_status)
+ break;
}
+ if (major_status)
+ gss_release_oid_set(&junk, mech_set);
+
*minor_status = 0;
- return (GSS_S_COMPLETE);
+ return major_status;
}