Nalin Dahyabhai 2eb0567
commit ef8e19af863158e4c1abc15fc710aa8cfad38406
Nalin Dahyabhai 2eb0567
Author: Greg Hudson <ghudson@mit.edu>
Nalin Dahyabhai 2eb0567
Date:   Wed Jan 15 12:51:42 2014 -0500
Nalin Dahyabhai 2eb0567
Nalin Dahyabhai 2eb0567
    Clean up GSS krb5 acquire_accept_cred
Nalin Dahyabhai 2eb0567
    
Nalin Dahyabhai 2eb0567
    Use a cleanup handler instead of releasing kt in multiple error
Nalin Dahyabhai 2eb0567
    clauses.  Wrap a long line and fix a comment with a missing word.
Nalin Dahyabhai 2eb0567
    Rewrap the function arguments to use fewer lines.
Nalin Dahyabhai 2eb0567
Nalin Dahyabhai 2eb0567
diff --git a/src/lib/gssapi/krb5/acquire_cred.c b/src/lib/gssapi/krb5/acquire_cred.c
Nalin Dahyabhai 2eb0567
index 9547207..37cc6b5 100644
Nalin Dahyabhai 2eb0567
--- a/src/lib/gssapi/krb5/acquire_cred.c
Nalin Dahyabhai 2eb0567
+++ b/src/lib/gssapi/krb5/acquire_cred.c
Nalin Dahyabhai 2eb0567
@@ -179,13 +179,13 @@ cleanup:
Nalin Dahyabhai 2eb0567
 */
Nalin Dahyabhai 2eb0567
 
Nalin Dahyabhai 2eb0567
 static OM_uint32
Nalin Dahyabhai 2eb0567
-acquire_accept_cred(krb5_context context,
Nalin Dahyabhai 2eb0567
-                    OM_uint32 *minor_status,
Nalin Dahyabhai 2eb0567
-                    krb5_keytab req_keytab,
Nalin Dahyabhai 2eb0567
-                    krb5_gss_cred_id_rec *cred)
Nalin Dahyabhai 2eb0567
+acquire_accept_cred(krb5_context context, OM_uint32 *minor_status,
Nalin Dahyabhai 2eb0567
+                    krb5_keytab req_keytab, krb5_gss_cred_id_rec *cred)
Nalin Dahyabhai 2eb0567
 {
Nalin Dahyabhai 2eb0567
+    OM_uint32 major;
Nalin Dahyabhai 2eb0567
     krb5_error_code code;
Nalin Dahyabhai 2eb0567
-    krb5_keytab kt;
Nalin Dahyabhai 2eb0567
+    krb5_keytab kt = NULL;
Nalin Dahyabhai 2eb0567
+    krb5_rcache rc = NULL;
Nalin Dahyabhai 2eb0567
 
Nalin Dahyabhai 2eb0567
     assert(cred->keytab == NULL);
Nalin Dahyabhai 2eb0567
 
Nalin Dahyabhai 2eb0567
@@ -202,46 +202,54 @@ acquire_accept_cred(krb5_context context,
Nalin Dahyabhai 2eb0567
         }
Nalin Dahyabhai 2eb0567
     }
Nalin Dahyabhai 2eb0567
     if (code) {
Nalin Dahyabhai 2eb0567
-        *minor_status = code;
Nalin Dahyabhai 2eb0567
-        return GSS_S_CRED_UNAVAIL;
Nalin Dahyabhai 2eb0567
+        major = GSS_S_CRED_UNAVAIL;
Nalin Dahyabhai 2eb0567
+        goto cleanup;
Nalin Dahyabhai 2eb0567
     }
Nalin Dahyabhai 2eb0567
 
Nalin Dahyabhai 2eb0567
     if (cred->name != NULL) {
Nalin Dahyabhai 2eb0567
-        /* Make sure we keys matching the desired name in the keytab. */
Nalin Dahyabhai 2eb0567
+        /* Make sure we have keys matching the desired name in the keytab. */
Nalin Dahyabhai 2eb0567
         code = check_keytab(context, kt, cred->name);
Nalin Dahyabhai 2eb0567
         if (code) {
Nalin Dahyabhai 2eb0567
-            krb5_kt_close(context, kt);
Nalin Dahyabhai 2eb0567
             if (code == KRB5_KT_NOTFOUND) {
Nalin Dahyabhai 2eb0567
                 char *errstr = (char *)krb5_get_error_message(context, code);
Nalin Dahyabhai 2eb0567
-                krb5_set_error_message(context, KG_KEYTAB_NOMATCH, "%s", errstr);
Nalin Dahyabhai 2eb0567
+                krb5_set_error_message(context, KG_KEYTAB_NOMATCH, "%s",
Nalin Dahyabhai 2eb0567
+                                       errstr);
Nalin Dahyabhai 2eb0567
                 krb5_free_error_message(context, errstr);
Nalin Dahyabhai 2eb0567
-                *minor_status = KG_KEYTAB_NOMATCH;
Nalin Dahyabhai 2eb0567
-            } else
Nalin Dahyabhai 2eb0567
-                *minor_status = code;
Nalin Dahyabhai 2eb0567
-            return GSS_S_CRED_UNAVAIL;
Nalin Dahyabhai 2eb0567
+                code = KG_KEYTAB_NOMATCH;
Nalin Dahyabhai 2eb0567
+            }
Nalin Dahyabhai 2eb0567
+            major = GSS_S_CRED_UNAVAIL;
Nalin Dahyabhai 2eb0567
+            goto cleanup;
Nalin Dahyabhai 2eb0567
         }
Nalin Dahyabhai 2eb0567
 
Nalin Dahyabhai 2eb0567
         /* Open the replay cache for this principal. */
Nalin Dahyabhai 2eb0567
         code = krb5_get_server_rcache(context, &cred->name->princ->data[0],
Nalin Dahyabhai 2eb0567
-                                      &cred->rcache);
Nalin Dahyabhai 2eb0567
+                                      &rc);
Nalin Dahyabhai 2eb0567
         if (code) {
Nalin Dahyabhai 2eb0567
-            krb5_kt_close(context, kt);
Nalin Dahyabhai 2eb0567
-            *minor_status = code;
Nalin Dahyabhai 2eb0567
-            return GSS_S_FAILURE;
Nalin Dahyabhai 2eb0567
+            major = GSS_S_FAILURE;
Nalin Dahyabhai 2eb0567
+            goto cleanup;
Nalin Dahyabhai 2eb0567
         }
Nalin Dahyabhai 2eb0567
     } else {
Nalin Dahyabhai 2eb0567
         /* Make sure we have a keytab with keys in it. */
Nalin Dahyabhai 2eb0567
         code = krb5_kt_have_content(context, kt);
Nalin Dahyabhai 2eb0567
         if (code) {
Nalin Dahyabhai 2eb0567
-            krb5_kt_close(context, kt);
Nalin Dahyabhai 2eb0567
-            *minor_status = code;
Nalin Dahyabhai 2eb0567
-            return GSS_S_CRED_UNAVAIL;
Nalin Dahyabhai 2eb0567
+            major = GSS_S_CRED_UNAVAIL;
Nalin Dahyabhai 2eb0567
+            goto cleanup;
Nalin Dahyabhai 2eb0567
         }
Nalin Dahyabhai 2eb0567
     }
Nalin Dahyabhai 2eb0567
 
Nalin Dahyabhai 2eb0567
     cred->keytab = kt;
Nalin Dahyabhai 2eb0567
+    kt = NULL;
Nalin Dahyabhai 2eb0567
+    cred->rcache = rc;
Nalin Dahyabhai 2eb0567
+    rc = NULL;
Nalin Dahyabhai 2eb0567
+    major = GSS_S_COMPLETE;
Nalin Dahyabhai 2eb0567
 
Nalin Dahyabhai 2eb0567
-    return GSS_S_COMPLETE;
Nalin Dahyabhai 2eb0567
+cleanup:
Nalin Dahyabhai 2eb0567
+    if (kt != NULL)
Nalin Dahyabhai 2eb0567
+        krb5_kt_close(context, kt);
Nalin Dahyabhai 2eb0567
+    if (rc != NULL)
Nalin Dahyabhai 2eb0567
+        krb5_rc_close(context, rc);
Nalin Dahyabhai 2eb0567
+    *minor_status = code;
Nalin Dahyabhai 2eb0567
+    return major;
Nalin Dahyabhai 2eb0567
 }
Nalin Dahyabhai 2eb0567
 #endif /* LEAN_CLIENT */
Nalin Dahyabhai 2eb0567