diff --git a/lib/krb5/mcache.c b/lib/krb5/mcache.c index 5cd8cad63..8298be829 100644 --- a/lib/krb5/mcache.c +++ b/lib/krb5/mcache.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997-2002 Kungliga Tekniska Högskolan + * Copyright (c) 1997-2004 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -38,6 +38,7 @@ RCSID("$Id$"); typedef struct krb5_mcache { char *name; unsigned int refcnt; + int dead; krb5_principal primary_principal; struct link { krb5_creds cred; @@ -51,7 +52,7 @@ static struct krb5_mcache *mcc_head; #define MCACHE(X) ((krb5_mcache *)(X)->data.data) -#define MISDEAD(X) ((X)->primary_principal == NULL) +#define MISDEAD(X) ((X)->dead) #define MCC_CURSOR(C) ((struct link*)(C)) @@ -90,6 +91,7 @@ mcc_alloc(const char *name) return NULL; } + m->dead = 0; m->refcnt = 1; m->primary_principal = NULL; m->creds = NULL; @@ -153,9 +155,11 @@ mcc_initialize(krb5_context context, krb5_ccache id, krb5_principal primary_principal) { + krb5_mcache *m = MCACHE(id); + m->dead = 0; return krb5_copy_principal (context, primary_principal, - &MCACHE(id)->primary_principal); + &m->primary_principal); } static krb5_error_code @@ -196,9 +200,12 @@ mcc_destroy(krb5_context context, } } HEIMDAL_MUTEX_unlock(&mcc_mutex); - krb5_free_principal (context, m->primary_principal); - m->primary_principal = NULL; - + 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;