s4:heimdal: import lorikeet-heimdal-202201172009 (commit 5a0b45cd723628b3690ea848548b...
[samba.git] / source4 / heimdal / lib / gssapi / mech / gss_indicate_mechs.c
index 8fd53d956d58926b37fc72fb61f02245bcddd321..9eef62e0b51345a755cd6e24d0c020b77a957fc2 100644 (file)
@@ -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;
 }