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)
{
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;
- int i;
+ 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;
}
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;