diff options
Diffstat (limited to 'source4/heimdal/lib/gssapi/mech/gss_indicate_mechs.c')
-rw-r--r-- | source4/heimdal/lib/gssapi/mech/gss_indicate_mechs.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/source4/heimdal/lib/gssapi/mech/gss_indicate_mechs.c b/source4/heimdal/lib/gssapi/mech/gss_indicate_mechs.c index 8fd53d956d5..9eef62e0b51 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_indicate_mechs.c +++ b/source4/heimdal/lib/gssapi/mech/gss_indicate_mechs.c @@ -33,7 +33,7 @@ gss_indicate_mechs(OM_uint32 *minor_status, 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; @@ -43,22 +43,32 @@ gss_indicate_mechs(OM_uint32 *minor_status, 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; } |