diff options
author | Greg Hudson <ghudson@mit.edu> | 2013-07-15 12:20:26 -0400 |
---|---|---|
committer | Greg Hudson <ghudson@mit.edu> | 2013-07-15 12:20:26 -0400 |
commit | d9457b501cbab535e5968dbdf195ca334b9fa555 (patch) | |
tree | c9ff36befead0c3530f82b1574ffeafb7333af94 /src/lib/kdb | |
parent | 4365d313c6109988268b746bcaf1c08f7b7a593c (diff) | |
download | krb5-d9457b501cbab535e5968dbdf195ca334b9fa555.tar.gz krb5-d9457b501cbab535e5968dbdf195ca334b9fa555.tar.xz krb5-d9457b501cbab535e5968dbdf195ca334b9fa555.zip |
Avoid allocating zero key_data structures
When we allocate space for an array of key_data structures, make sure
we allocate at least one, so we don't spuriously fail on platforms
where malloc(0) returns NULL. Where we use malloc, use k5calloc
instead. Where we use krb5_db_alloc or realloc, just allocate an
extra entry.
Diffstat (limited to 'src/lib/kdb')
-rw-r--r-- | src/lib/kdb/kdb_convert.c | 17 |
1 files changed, 7 insertions, 10 deletions
diff --git a/src/lib/kdb/kdb_convert.c b/src/lib/kdb/kdb_convert.c index f08d4233b7..ee3e984ec7 100644 --- a/src/lib/kdb/kdb_convert.c +++ b/src/lib/kdb/kdb_convert.c @@ -589,6 +589,7 @@ ulog_conv_2dbentry(krb5_context context, krb5_db_entry **entry, krb5_error_code ret; unsigned int prev_n_keys = 0; krb5_boolean is_add; + void *newptr; *entry = NULL; @@ -687,15 +688,12 @@ ulog_conv_2dbentry(krb5_context context, krb5_db_entry **entry, if (is_add) ent->key_data = NULL; - ent->key_data = (krb5_key_data *)realloc(ent->key_data, - (ent->n_key_data * - sizeof (krb5_key_data))); - /* XXX Memory leak: Old key data in - records eliminated by resizing to - smaller size. */ - if (ent->key_data == NULL) - /* XXX Memory leak: old storage. */ - return (ENOMEM); + /* Allocate one extra key data to avoid allocating zero bytes. */ + newptr = realloc(ent->key_data, (ent->n_key_data + 1) * + sizeof(krb5_key_data)); + if (newptr == NULL) + return ENOMEM; + ent->key_data = newptr; /* BEGIN CSTYLED */ for (j = prev_n_keys; j < ent->n_key_data; j++) { @@ -713,7 +711,6 @@ ulog_conv_2dbentry(krb5_context context, krb5_db_entry **entry, } for (cnt = 0; cnt < kp->key_data_ver; cnt++) { - void *newptr; kp->key_data_type[cnt] = (krb5_int16)kv->k_enctype.k_enctype_val[cnt]; kp->key_data_length[cnt] = (krb5_int16)kv->k_contents.k_contents_val[cnt].utf8str_t_len; newptr = realloc(kp->key_data_contents[cnt], |