use add_HDB_Ext_KeySet and plug memory leak

This commit is contained in:
Love Hörnquist Åstrand
2011-07-24 18:14:25 -07:00
parent c204f3c5ce
commit f9afd37eed

View File

@@ -208,67 +208,55 @@ parse_key_set(krb5_context context, const char *key,
krb5_error_code krb5_error_code
hdb_add_current_keys_to_history(krb5_context context, hdb_entry *entry) hdb_add_current_keys_to_history(krb5_context context, hdb_entry *entry)
{ {
krb5_boolean replace = FALSE;
krb5_error_code ret; krb5_error_code ret;
HDB_extension *ext; HDB_extension *ext;
HDB_Ext_KeySet *hist_keys; hdb_keyset newkey;
hdb_keyset *tmp_keysets; time_t newtime;
size_t i;
size_t replace = 0;
ext = hdb_find_extension(entry, choice_HDB_extension_data_hist_keys); ext = hdb_find_extension(entry, choice_HDB_extension_data_hist_keys);
if (ext != NULL) { if (ext == NULL) {
hist_keys = &ext->data.u.hist_keys; replace = TRUE;
tmp_keysets = realloc(hist_keys->val,
sizeof (*hist_keys->val) * (hist_keys->len + 1));
if (tmp_keysets == NULL)
return ENOMEM;
hist_keys->val = tmp_keysets;
memmove(&hist_keys->val[1], hist_keys->val,
sizeof (*hist_keys->val) * hist_keys->len++);
} else {
replace = 1;
ext = calloc(1, sizeof (*ext)); ext = calloc(1, sizeof (*ext));
if (ext == NULL) if (ext == NULL)
return ENOMEM; return krb5_enomem(context);
ext->data.element = choice_HDB_extension_data_hist_keys; ext->data.element = choice_HDB_extension_data_hist_keys;
hist_keys = &ext->data.u.hist_keys;
hist_keys->val = calloc(1, sizeof (*hist_keys->val));
if (hist_keys->val == NULL) {
free(hist_keys);
return ENOMEM;
}
hist_keys->len = 1;
} }
hist_keys->val[0].keys.len = 0; /*
hist_keys->val[0].keys.val = calloc(entry->keys.len, * Copy in newest old keyset
sizeof (*hist_keys->val[0].keys.val)); */
for (i = 0; i < entry->keys.len; i++, hist_keys->val[0].keys.len++) {
ret = copy_Key(&entry->keys.val[i], &hist_keys->val[0].keys.val[i]); ret = hdb_entry_get_pw_change_time(entry, &newtime);
if (ret) { if (ret)
free_HDB_extension(ext); goto out;
return ret;
} memset(&newkey, 0, sizeof(newkey));
} newkey.keys = entry->keys;
hist_keys->val[0].kvno = entry->kvno; newkey.kvno = entry->kvno;
hist_keys->val[0].set_time = malloc(sizeof (*hist_keys->val[0].set_time)); newkey.set_time = &newtime;
if (hist_keys->val[0].set_time == NULL) {
free_HDB_extension(ext); ret = add_HDB_Ext_KeySet(&ext->data.u.hist_keys, &newkey);
return ENOMEM; if (ret)
} goto out;
(void) hdb_entry_get_pw_change_time(entry, hist_keys->val[0].set_time);
if (replace) { if (replace) {
/* hdb_replace_extension() deep-copies ext; what a waste */ /* hdb_replace_extension() deep-copies ext; what a waste */
ret = hdb_replace_extension(context, entry, ext); ret = hdb_replace_extension(context, entry, ext);
if (ret) { if (ret)
goto out;
}
out:
if (ext) {
free_HDB_extension(ext); free_HDB_extension(ext);
if (replace)
free(ext);
}
return ret; return ret;
} }
free_HDB_extension(ext);
}
return 0;
}
static krb5_error_code static krb5_error_code