diff options
Diffstat (limited to 'lib/gssapi/mech/gss_acquire_cred_ext.c')
-rw-r--r-- | lib/gssapi/mech/gss_acquire_cred_ext.c | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/lib/gssapi/mech/gss_acquire_cred_ext.c b/lib/gssapi/mech/gss_acquire_cred_ext.c index 1cbb29f141f3..9f2674c26ecc 100644 --- a/lib/gssapi/mech/gss_acquire_cred_ext.c +++ b/lib/gssapi/mech/gss_acquire_cred_ext.c @@ -100,13 +100,22 @@ _gss_acquire_mech_cred(OM_uint32 *minor_status, mc= NULL; } - *output_cred_handle = mc; + if (major_status != GSS_S_COMPLETE) + free(mc); + else + *output_cred_handle = mc; return major_status; } +/** + * This function is not a public interface and is deprecated anyways, do + * not use. Use gss_acquire_cred_with_password() instead for now. + * + * @deprecated + */ OM_uint32 _gss_acquire_cred_ext(OM_uint32 *minor_status, - const gss_name_t desired_name, + gss_const_name_t desired_name, gss_const_OID credential_type, const void *credential_data, OM_uint32 time_req, @@ -152,7 +161,6 @@ _gss_acquire_cred_ext(OM_uint32 *minor_status, for (i = 0; i < mechs->count; i++) { struct _gss_mechanism_name *mn = NULL; struct _gss_mechanism_cred *mc = NULL; - gss_name_t desired_mech_name = GSS_C_NO_NAME; m = __gss_get_mechanism(&mechs->elements[i]); if (!m) @@ -163,16 +171,17 @@ _gss_acquire_cred_ext(OM_uint32 *minor_status, &mechs->elements[i], &mn); if (major_status != GSS_S_COMPLETE) continue; - - desired_mech_name = mn->gmn_name; } major_status = _gss_acquire_mech_cred(minor_status, m, mn, credential_type, credential_data, time_req, desired_mech, cred_usage, &mc); - if (GSS_ERROR(major_status)) + if (GSS_ERROR(major_status)) { + if (mechs->count == 1) + _gss_mg_error(m, major_status, *minor_status); continue; + } HEIM_SLIST_INSERT_HEAD(&cred->gc_mc, mc, gmc_link); } @@ -183,7 +192,8 @@ _gss_acquire_cred_ext(OM_uint32 *minor_status, */ if (!HEIM_SLIST_FIRST(&cred->gc_mc)) { free(cred); - *minor_status = 0; + if (mechs->count > 1) + *minor_status = 0; return GSS_S_NO_CRED; } |