aboutsummaryrefslogtreecommitdiff
path: root/lib/gssapi/mech/gss_store_cred.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gssapi/mech/gss_store_cred.c')
-rw-r--r--lib/gssapi/mech/gss_store_cred.c36
1 files changed, 21 insertions, 15 deletions
diff --git a/lib/gssapi/mech/gss_store_cred.c b/lib/gssapi/mech/gss_store_cred.c
index 4d2bfdec8b1a..a92611570eb6 100644
--- a/lib/gssapi/mech/gss_store_cred.c
+++ b/lib/gssapi/mech/gss_store_cred.c
@@ -45,7 +45,9 @@ gss_store_cred(OM_uint32 *minor_status,
{
struct _gss_cred *cred = (struct _gss_cred *) input_cred_handle;
struct _gss_mechanism_cred *mc;
- OM_uint32 maj, junk;
+ OM_uint32 maj = GSS_S_FAILURE;
+ OM_uint32 junk;
+ size_t successes = 0;
if (minor_status == NULL)
return GSS_S_FAILURE;
@@ -69,26 +71,30 @@ gss_store_cred(OM_uint32 *minor_status,
if (m == NULL || m->gm_store_cred == NULL)
continue;
- if (desired_mech) {
- maj = gss_oid_equal(&m->gm_mech_oid, desired_mech);
- if (maj != 0)
- continue;
- }
+ if (desired_mech != GSS_C_NO_OID &&
+ !gss_oid_equal(&m->gm_mech_oid, desired_mech))
+ continue;
maj = (m->gm_store_cred)(minor_status, mc->gmc_cred,
cred_usage, desired_mech, overwrite_cred,
default_cred, NULL, cred_usage_stored);
- if (maj != GSS_S_COMPLETE) {
- gss_release_oid_set(&junk, elements_stored);
- return maj;
- }
+ if (maj == GSS_S_COMPLETE) {
+ if (elements_stored)
+ gss_add_oid_set_member(&junk, desired_mech, elements_stored);
+ successes++;
+ } else if (desired_mech != GSS_C_NO_OID) {
+ gss_release_oid_set(&junk, elements_stored);
+ return maj;
+ }
- if (elements_stored) {
- gss_add_oid_set_member(&junk,
- &m->gm_mech_oid,
- elements_stored);
- }
+ }
+ if (successes == 0) {
+ if (maj != GSS_S_COMPLETE)
+ return maj; /* last failure */
+ return GSS_S_FAILURE;
}
+
+ *minor_status = 0;
return GSS_S_COMPLETE;
}