Implement gssEapDeriveRFC3961Key
[mech_eap.orig] / util_name.c
index 1c5910d..97829d5 100644 (file)
@@ -35,6 +35,7 @@
 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 +46,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,9 +60,14 @@ 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;
     }
@@ -66,9 +78,11 @@ gssEapReleaseName(OM_uint32 *minor, gss_name_t *pName)
         krb5_free_context(kerbCtx);
     }
 
+    GSSEAP_MUTEX_DESTROY(&name->mutex);
     GSSEAP_FREE(name);
     *pName = NULL;
 
+    *minor = 0;
     return GSS_S_COMPLETE;
 }