aboutsummaryrefslogtreecommitdiff
path: root/lib/gssapi/mech/gss_acquire_cred_ext.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gssapi/mech/gss_acquire_cred_ext.c')
-rw-r--r--lib/gssapi/mech/gss_acquire_cred_ext.c24
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;
}