X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=duplicate_name.c;h=b936655ee137dfe0c2ccbda959d5b776468a3f41;hb=1f273eda615c04331df6849cfbf3cfad069ea8b0;hp=3e0654bfc89622e45b276dd4605e2a0311459de1;hpb=31cef49681566dc99790812f31de834dfce02c74;p=mech_eap.orig diff --git a/duplicate_name.c b/duplicate_name.c index 3e0654b..b936655 100644 --- a/duplicate_name.c +++ b/duplicate_name.c @@ -32,3 +32,57 @@ #include "gssapiP_eap.h" +OM_uint32 +gss_duplicate_name(OM_uint32 *minor, + const gss_name_t input_name, + gss_name_t *dest_name) +{ + OM_uint32 major, tmpMinor; + krb5_context krbContext; + gss_name_t name; + + if (input_name == GSS_C_NO_NAME) { + *minor = EINVAL; + return GSS_S_CALL_INACCESSIBLE_READ | GSS_S_BAD_NAME; + } + + GSSEAP_KRB_INIT(&krbContext); + + major = gssEapAllocName(minor, &name); + if (GSS_ERROR(major)) { + return major; + } + + /* Lock mutex for copying mutable attributes */ + GSSEAP_MUTEX_LOCK(&input_name->mutex); + + *minor = krb5_copy_principal(krbContext, input_name->krbPrincipal, + &name->krbPrincipal); + if (*minor != 0) { + major = GSS_S_FAILURE; + goto cleanup; + } + + if (input_name->flags & NAME_FLAG_RADIUS_ATTRIBUTES) { + major = radiusDuplicateAttrContext(minor, input_name, name); + if (GSS_ERROR(major)) + goto cleanup; + } + + if (input_name->flags & NAME_FLAG_SAML_ATTRIBUTES) { + major = samlDuplicateAttrContext(minor, input_name, name); + if (GSS_ERROR(major)) + goto cleanup; + } + + *dest_name = name; + +cleanup: + GSSEAP_MUTEX_UNLOCK(&input_name->mutex); + + if (GSS_ERROR(major)) { + gssEapReleaseName(&tmpMinor, &name); + } + + return major; +}