summaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/kadm5/srv/svr_principal.c24
-rw-r--r--src/lib/kdb/kdb_convert.c17
2 files changed, 20 insertions, 21 deletions
diff --git a/src/lib/kadm5/srv/svr_principal.c b/src/lib/kadm5/srv/svr_principal.c
index 6c7a2c0d5..2bb871166 100644
--- a/src/lib/kadm5/srv/svr_principal.c
+++ b/src/lib/kadm5/srv/svr_principal.c
@@ -941,11 +941,10 @@ kadm5_get_principal(void *server_handle, krb5_principal principal,
if (mask & KADM5_KEY_DATA) {
entry->n_key_data = kdb->n_key_data;
if(entry->n_key_data) {
- entry->key_data = malloc(entry->n_key_data*sizeof(krb5_key_data));
- if (entry->key_data == NULL) {
- ret = ENOMEM;
+ entry->key_data = k5calloc(entry->n_key_data,
+ sizeof(krb5_key_data), &ret);
+ if (entry->key_data == NULL)
goto done;
- }
} else
entry->key_data = NULL;
@@ -1070,14 +1069,14 @@ int create_history_entry(krb5_context context,
krb5_keyblock *hist_key, int n_key_data,
krb5_key_data *key_data, osa_pw_hist_ent *hist)
{
- int i, ret;
+ krb5_error_code ret;
krb5_keyblock key;
krb5_keysalt salt;
+ int i;
- hist->key_data = (krb5_key_data*)malloc(n_key_data*sizeof(krb5_key_data));
+ hist->key_data = k5calloc(n_key_data, sizeof(krb5_key_data), &ret);
if (hist->key_data == NULL)
- return ENOMEM;
- memset(hist->key_data, 0, n_key_data*sizeof(krb5_key_data));
+ return ret;
for (i = 0; i < n_key_data; i++) {
ret = krb5_dbe_decrypt_key_data(context, NULL, &key_data[i], &key,
@@ -1999,8 +1998,10 @@ kadm5_setkey_principal_3(void *server_handle,
old_key_data = NULL;
}
- kdb->key_data = (krb5_key_data*)krb5_db_alloc(handle->context, NULL, (n_keys+n_old_keys)
- *sizeof(krb5_key_data));
+ /* Allocate one extra key_data to avoid allocating 0 bytes. */
+ kdb->key_data = krb5_db_alloc(handle->context, NULL,
+ (n_keys + n_old_keys + 1) *
+ sizeof(krb5_key_data));
if (kdb->key_data == NULL) {
ret = ENOMEM;
goto done;
@@ -2330,8 +2331,9 @@ kadm5_purgekeys(void *server_handle,
old_keydata = kdb->key_data;
n_old_keydata = kdb->n_key_data;
kdb->n_key_data = 0;
+ /* Allocate one extra key_data to avoid allocating 0 bytes. */
kdb->key_data = krb5_db_alloc(handle->context, NULL,
- n_old_keydata * sizeof(krb5_key_data));
+ (n_old_keydata + 1) * sizeof(krb5_key_data));
if (kdb->key_data == NULL) {
ret = ENOMEM;
goto done;
diff --git a/src/lib/kdb/kdb_convert.c b/src/lib/kdb/kdb_convert.c
index f08d4233b..ee3e984ec 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],