diff options
author | Greg Hudson <ghudson@mit.edu> | 2009-02-05 18:19:23 +0000 |
---|---|---|
committer | Greg Hudson <ghudson@mit.edu> | 2009-02-05 18:19:23 +0000 |
commit | 293242e87b276d9b56c03b5269781361f2b4acfc (patch) | |
tree | fb8c5fad065b5bfeebdaa24bcc8294778172cd4b /src | |
parent | e10e160f0f5038d057ae21c3f1cd07c00681912e (diff) | |
download | krb5-293242e87b276d9b56c03b5269781361f2b4acfc.tar.gz krb5-293242e87b276d9b56c03b5269781361f2b4acfc.tar.xz krb5-293242e87b276d9b56c03b5269781361f2b4acfc.zip |
Fix a memory leak in krb5_kt_resolve when we fail to lock
kt_typehead_lock.
ticket: 6367
tags: pullup
target_version: 1.7
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@21890 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/krb5/keytab/ktbase.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/src/lib/krb5/keytab/ktbase.c b/src/lib/krb5/keytab/ktbase.c index 9d51745402..a764cc5939 100644 --- a/src/lib/krb5/keytab/ktbase.c +++ b/src/lib/krb5/keytab/ktbase.c @@ -162,10 +162,10 @@ krb5_error_code KRB5_CALLCONV krb5_kt_resolve (krb5_context context, const char *name, krb5_keytab *ktid) { const struct krb5_kt_typelist *tlist; - char *pfx; + char *pfx = NULL; unsigned int pfxlen; const char *cp, *resid; - krb5_error_code err; + krb5_error_code err = 0; cp = strchr (name, ':'); if (!cp) { @@ -201,7 +201,7 @@ krb5_kt_resolve (krb5_context context, const char *name, krb5_keytab *ktid) err = k5_mutex_lock(&kt_typehead_lock); if (err) - return err; + goto cleanup; tlist = kt_typehead; /* Don't need to hold the lock, since entries are never modified or removed once they're in the list. Just need to protect @@ -209,12 +209,15 @@ krb5_kt_resolve (krb5_context context, const char *name, krb5_keytab *ktid) k5_mutex_unlock(&kt_typehead_lock); for (; tlist; tlist = tlist->next) { if (strcmp (tlist->ops->prefix, pfx) == 0) { - free(pfx); - return (*tlist->ops->resolve)(context, resid, ktid); + err = (*tlist->ops->resolve)(context, resid, ktid); + goto cleanup; } } + err = KRB5_KT_UNKNOWN_TYPE; + +cleanup: free(pfx); - return KRB5_KT_UNKNOWN_TYPE; + return err; } /* |