summaryrefslogtreecommitdiff
path: root/source4/heimdal/lib/gssapi/mech/gss_indicate_mechs.c
diff options
context:
space:
mode:
Diffstat (limited to 'source4/heimdal/lib/gssapi/mech/gss_indicate_mechs.c')
-rw-r--r--source4/heimdal/lib/gssapi/mech/gss_indicate_mechs.c20
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;
}