summaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
authorTom Yu <tlyu@mit.edu>2006-12-01 20:57:04 +0000
committerTom Yu <tlyu@mit.edu>2006-12-01 20:57:04 +0000
commit2f87558821aa906d2b2afc4753d8ea9e6121717f (patch)
treed8765c03f963ca8eddb3c433940948d2cd27f5b3 /src/lib
parent4e4b77279e9fdccc20a6871c68f6bf053df7a1f6 (diff)
downloadkrb5-2f87558821aa906d2b2afc4753d8ea9e6121717f.tar.gz
krb5-2f87558821aa906d2b2afc4753d8ea9e6121717f.tar.xz
krb5-2f87558821aa906d2b2afc4753d8ea9e6121717f.zip
* src/lib/krb5/ccache/cc_file.c: Adapted patch from Roland
Dowdeswell to avoid possible double-free conditions on certain errors. ticket: 4788 tags: pullup target_version: 1.6 component: krb5-libs git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@18897 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/krb5/ccache/cc_file.c32
1 files changed, 24 insertions, 8 deletions
diff --git a/src/lib/krb5/ccache/cc_file.c b/src/lib/krb5/ccache/cc_file.c
index 5b11a0e01..c87fef4e0 100644
--- a/src/lib/krb5/ccache/cc_file.c
+++ b/src/lib/krb5/ccache/cc_file.c
@@ -443,6 +443,8 @@ krb5_fcc_read_principal(krb5_context context, krb5_ccache id, krb5_principal *pr
k5_assert_locked(&((krb5_fcc_data *) id->data)->lock);
+ *princ = NULL;
+
if (data->version == KRB5_FCC_FVNO_1) {
type = KRB5_NT_UNKNOWN;
} else {
@@ -538,15 +540,18 @@ krb5_fcc_read_addrs(krb5_context context, krb5_ccache id, krb5_address ***addrs)
if ((*addrs)[i] == NULL) {
krb5_free_addresses(context, *addrs);
return KRB5_CC_NOMEM;
- }
+ }
+ (*addrs)[i]->contents = NULL;
kret = krb5_fcc_read_addr(context, id, (*addrs)[i]);
CHECK(kret);
}
return KRB5_OK;
errout:
- if (*addrs)
+ if (*addrs) {
krb5_free_addresses(context, *addrs);
+ *addrs = NULL;
+ }
return kret;
}
@@ -593,8 +598,10 @@ krb5_fcc_read_keyblock(krb5_context context, krb5_ccache id, krb5_keyblock *keyb
return KRB5_OK;
errout:
- if (keyblock->contents)
+ if (keyblock->contents) {
krb5_xfree(keyblock->contents);
+ keyblock->contents = NULL;
+ }
return kret;
}
@@ -632,8 +639,10 @@ krb5_fcc_read_data(krb5_context context, krb5_ccache id, krb5_data *data)
data->data[data->length] = 0; /* Null terminate, just in case.... */
return KRB5_OK;
errout:
- if (data->data)
+ if (data->data) {
krb5_xfree(data->data);
+ data->data = NULL;
+ }
return kret;
}
@@ -675,8 +684,10 @@ krb5_fcc_read_addr(krb5_context context, krb5_ccache id, krb5_address *addr)
return KRB5_OK;
errout:
- if (addr->contents)
+ if (addr->contents) {
krb5_xfree(addr->contents);
+ addr->contents = NULL;
+ }
return kret;
}
@@ -804,15 +815,18 @@ krb5_fcc_read_authdata(krb5_context context, krb5_ccache id, krb5_authdata ***a)
if ((*a)[i] == NULL) {
krb5_free_authdata(context, *a);
return KRB5_CC_NOMEM;
- }
+ }
+ (*a)[i]->contents = NULL;
kret = krb5_fcc_read_authdatum(context, id, (*a)[i]);
CHECK(kret);
}
return KRB5_OK;
errout:
- if (*a)
+ if (*a) {
krb5_free_authdata(context, *a);
+ *a = NULL;
+ }
return kret;
}
@@ -853,8 +867,10 @@ krb5_fcc_read_authdatum(krb5_context context, krb5_ccache id, krb5_authdata *a)
return KRB5_OK;
errout:
- if (a->contents)
+ if (a->contents) {
krb5_xfree(a->contents);
+ a->contents = NULL;
+ }
return kret;
}