HEIMDAL:lib/krb5: destroy a memory ccache on reinit
authorStefan Metzmacher <metze@samba.org>
Mon, 10 Oct 2016 13:53:26 +0000 (15:53 +0200)
committerJeremy Allison <jra@samba.org>
Wed, 12 Oct 2016 18:54:08 +0000 (20:54 +0200)
BUG: https://bugzilla.samba.org/show_bug.cgi?id=12369

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Günther Deschner <gd@samba.org>
Reviewed-by: Uri Simchoni <uri@samba.org>
source4/heimdal/lib/krb5/mcache.c

index e4b90c17e7b2cdc920604ad7166784ed85e8a8f7..dc79b87417188127b7c458e7b2c45f259f027478 100644 (file)
@@ -155,13 +155,47 @@ mcc_gen_new(krb5_context context, krb5_ccache *id)
     return 0;
 }
 
+static void KRB5_CALLCONV
+mcc_destroy_internal(krb5_context context,
+                    krb5_mcache *m)
+{
+    struct link *l;
+
+    if (m->primary_principal != NULL) {
+       krb5_free_principal (context, m->primary_principal);
+       m->primary_principal = NULL;
+    }
+    m->dead = 1;
+
+    l = m->creds;
+    while (l != NULL) {
+       struct link *old;
+
+       krb5_free_cred_contents (context, &l->cred);
+       old = l;
+       l = l->next;
+       free (old);
+    }
+
+    m->creds = NULL;
+    return;
+}
+
 static krb5_error_code KRB5_CALLCONV
 mcc_initialize(krb5_context context,
               krb5_ccache id,
               krb5_principal primary_principal)
 {
     krb5_mcache *m = MCACHE(id);
+    /*
+     * It's important to destroy any existing
+     * creds here, that matches the baheviour
+     * of all other backends and also the
+     * MEMORY: backend in MIT.
+     */
+    mcc_destroy_internal(context, m);
     m->dead = 0;
+    m->kdc_offset = 0;
     m->mtime = time(NULL);
     return krb5_copy_principal (context,
                                primary_principal,
@@ -195,7 +229,6 @@ mcc_destroy(krb5_context context,
            krb5_ccache id)
 {
     krb5_mcache **n, *m = MCACHE(id);
-    struct link *l;
 
     if (m->refcnt == 0)
        krb5_abortx(context, "mcc_destroy: refcnt already 0");
@@ -211,22 +244,7 @@ mcc_destroy(krb5_context context,
            }
        }
        HEIMDAL_MUTEX_unlock(&mcc_mutex);
-       if (m->primary_principal != NULL) {
-           krb5_free_principal (context, m->primary_principal);
-           m->primary_principal = NULL;
-       }
-       m->dead = 1;
-
-       l = m->creds;
-       while (l != NULL) {
-           struct link *old;
-
-           krb5_free_cred_contents (context, &l->cred);
-           old = l;
-           l = l->next;
-           free (old);
-       }
-       m->creds = NULL;
+       mcc_destroy_internal(context, m);
     }
     return 0;
 }