gss: fix typo regression in setting minor_status
[metze/heimdal/wip.git] / lib / gssapi / mech / gss_inquire_cred_by_oid.c
index e674dd48f3e4ffd6d5d8e7a0f2b420995ea01c48..4e7c73fa41390f872150634080706e63b8deee62 100644 (file)
@@ -34,7 +34,7 @@
 
 GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL
 gss_inquire_cred_by_oid (OM_uint32 *minor_status,
-                        const gss_cred_id_t cred_handle,
+                        gss_const_cred_id_t cred_handle,
                         const gss_OID desired_object,
                         gss_buffer_set_t *data_set)
 {
@@ -50,13 +50,15 @@ gss_inquire_cred_by_oid (OM_uint32 *minor_status,
        if (cred == NULL)
                return GSS_S_NO_CRED;
 
-       HEIM_SLIST_FOREACH(mc, &cred->gc_mc, gmc_link) {
+       status = GSS_S_FAILURE;
+
+       HEIM_TAILQ_FOREACH(mc, &cred->gc_mc, gmc_link) {
                gss_buffer_set_t rset = GSS_C_NO_BUFFER_SET;
                size_t i;
 
                m = mc->gmc_mech;
                if (m == NULL) {
-                       gss_release_buffer_set(minor_status, &set);
+                       _gss_secure_release_buffer_set(minor_status, &set);
                        *minor_status = 0;
                        return GSS_S_BAD_MECH;
                }
@@ -66,18 +68,20 @@ gss_inquire_cred_by_oid (OM_uint32 *minor_status,
 
                status = m->gm_inquire_cred_by_oid(minor_status,
                    mc->gmc_cred, desired_object, &rset);
-               if (status != GSS_S_COMPLETE)
+               if (status != GSS_S_COMPLETE) {
+                       _gss_mg_error(m, *minor_status);
                        continue;
+               }
 
-               for (i = 0; i < rset->count; i++) {
+               for (i = 0; rset != NULL && i < rset->count; i++) {
                        status = gss_add_buffer_set_member(minor_status,
                             &rset->elements[i], &set);
                        if (status != GSS_S_COMPLETE)
                                break;
                }
-               gss_release_buffer_set(minor_status, &rset);
+               _gss_secure_release_buffer_set(minor_status, &rset);
        }
-       if (set == GSS_C_NO_BUFFER_SET)
+       if (set == GSS_C_NO_BUFFER_SET && status == GSS_S_COMPLETE)
                status = GSS_S_FAILURE;
        *data_set = set;
        *minor_status = 0;