release defaultIdentity/defaultCreds on error
[mech_eap.orig] / util_cred.c
index 8c4ce55..1cabdcf 100644 (file)
@@ -114,7 +114,7 @@ readDefaultIdentityAndCreds(OM_uint32 *minor,
                             gss_buffer_t defaultIdentity,
                             gss_buffer_t defaultCreds)
 {
-    OM_uint32 major;
+    OM_uint32 major, tmpMinor;
     FILE *fp = NULL;
     char pwbuf[BUFSIZ], buf[BUFSIZ];
     char *ccacheName;
@@ -141,8 +141,8 @@ readDefaultIdentityAndCreds(OM_uint32 *minor,
 
     fp = fopen(ccacheName, "r");
     if (fp == NULL) {
-        *minor = GSSEAP_NO_DEFAULT_CRED;
         major = GSS_S_CRED_UNAVAIL;
+        *minor = GSSEAP_NO_DEFAULT_CRED;
         goto cleanup;
     }
 
@@ -186,6 +186,11 @@ cleanup:
     if (fp != NULL)
         fclose(fp);
 
+    if (GSS_ERROR(major)) {
+        gss_release_buffer(&tmpMinor, defaultIdentity);
+        gss_release_buffer(&tmpMinor, defaultCreds);
+    }
+
     return major;
 }
 
@@ -245,12 +250,12 @@ gssEapAcquireCred(OM_uint32 *minor,
 
     if (cred->flags & CRED_FLAG_INITIATE) {
         major = readDefaultIdentityAndCreds(minor, &defaultIdentity, &defaultCreds);
-        if (GSS_ERROR(major))
-            goto cleanup;
-
-        major = gssEapImportName(minor, &defaultIdentity, GSS_C_NT_USER_NAME,
-                                 nameMech, &defaultIdentityName);
-        if (GSS_ERROR(major))
+        if (major == GSS_S_COMPLETE) {
+            major = gssEapImportName(minor, &defaultIdentity, GSS_C_NT_USER_NAME,
+                                     nameMech, &defaultIdentityName);
+            if (GSS_ERROR(major))
+                goto cleanup;
+        } else if (major != GSS_S_CRED_UNAVAIL)
             goto cleanup;
     }
 
@@ -296,6 +301,12 @@ gssEapAcquireCred(OM_uint32 *minor,
             if (GSS_ERROR(major))
                 goto cleanup;
         } else if (cred->flags & CRED_FLAG_INITIATE) {
+            if (defaultIdentityName == GSS_C_NO_NAME) {
+                major = GSS_S_CRED_UNAVAIL;
+                *minor = GSSEAP_NO_DEFAULT_IDENTITY;
+                goto cleanup;
+            }
+
             cred->name = defaultIdentityName;
             defaultIdentityName = GSS_C_NO_NAME;
         }
@@ -310,7 +321,8 @@ gssEapAcquireCred(OM_uint32 *minor,
             goto cleanup;
 
         cred->flags |= CRED_FLAG_PASSWORD;
-    } else if (defaultCreds.value != NULL) {
+    } else if (defaultCreds.value != NULL &&
+        (cred->flags & CRED_FLAG_DEFAULT_IDENTITY)) {
         cred->password = defaultCreds;
 
         defaultCreds.length = 0;