Add mech name OID, gss_display_name implementation
[mech_eap.git] / util_name.c
index 1c5910d..0f40a17 100644 (file)
 
 #include "gssapiP_eap.h"
 
+static const gss_OID_desc gssEapNtPrincipalName = {
+    /* 1.3.6.1.4.1.5322.21.2.1  */
+    12, "\x06\x0A\x2B\x06\x01\x04\x01\xA9\x4A\x15\x02\x01"
+};
+
+const gss_OID_desc *const GSS_EAP_NT_PRINCIPAL_NAME =
+    &gssEapNtPrincipalName;
+
 OM_uint32
 gssEapAllocName(OM_uint32 *minor, gss_name_t *pName)
 {
+    OM_uint32 tmpMinor;
     gss_name_t name;
 
     assert(*pName == GSS_C_NO_NAME);
@@ -45,6 +54,12 @@ gssEapAllocName(OM_uint32 *minor, gss_name_t *pName)
         return GSS_S_FAILURE;
     }
 
+    if (GSSEAP_MUTEX_INIT(&name->mutex) != 0) {
+        *minor = errno;
+        gssEapReleaseName(&tmpMinor, &name);
+        return GSS_S_FAILURE;
+    }
+
     *pName = name;
 
     return GSS_S_COMPLETE;
@@ -53,22 +68,29 @@ gssEapAllocName(OM_uint32 *minor, gss_name_t *pName)
 OM_uint32
 gssEapReleaseName(OM_uint32 *minor, gss_name_t *pName)
 {
-    gss_name_t name = *pName;
+    gss_name_t name;
     krb5_context kerbCtx = NULL;
 
+    if (pName == NULL) {
+        return GSS_S_COMPLETE;
+    }
+
+    name = *pName;
     if (name == GSS_C_NO_NAME) {
         return GSS_S_COMPLETE;
     }
 
     krb5_init_context(&kerbCtx);
-    krb5_free_principal(kerbCtx, name->kerberosName);
+    krb5_free_principal(kerbCtx, name->krbPrincipal);
     if (kerbCtx != NULL) {
         krb5_free_context(kerbCtx);
     }
 
+    GSSEAP_MUTEX_DESTROY(&name->mutex);
     GSSEAP_FREE(name);
     *pName = NULL;
 
+    *minor = 0;
     return GSS_S_COMPLETE;
 }