hdb_keyset ::= SEQUENCE {
kvno[0] INTEGER (0..4294967295),
keys[2] SEQUENCE OF Key,
- set-time[1] KerberosTime, -- time this keyset was created/set
+ set-time[1] KerberosTime OPTIONAL, -- time this keyset was created/set
...
}
HDB_Ext_KeySet *hist_keys;
hdb_keyset *tmp_keysets;
size_t i;
- size_t add = 0;
+ size_t replace = 0;
ext = hdb_find_extension(entry, choice_HDB_extension_data_hist_keys);
if (ext != NULL) {
memmove(&hist_keys->val[1], hist_keys->val,
sizeof (*hist_keys->val) * hist_keys->len++);
} else {
- add = 1;
+ replace = 1;
ext = calloc(1, sizeof (*ext));
if (ext == NULL)
return ENOMEM;
}
}
hist_keys->val[0].kvno = entry->kvno;
- (void) hdb_entry_get_pw_change_time(entry, &hist_keys->val[0].set_time);
+ hist_keys->val[0].set_time = malloc(sizeof (*hist_keys->val[0].set_time));
+ if (hist_keys->val[0].set_time == NULL) {
+ free_HDB_extension(ext);
+ return ENOMEM;
+ }
+ (void) hdb_entry_get_pw_change_time(entry, hist_keys->val[0].set_time);
- if (add) {
- /* XXX hdb_replace_extension() deep-copies ext; what a waste */
+ if (replace) {
+ /* hdb_replace_extension() deep-copies ext; what a waste */
ret = hdb_replace_extension(context, entry, ext);
if (ret) {
free_HDB_extension(ext);
return ret;
}
+ free_HDB_extension(ext);
}
-
- /* hdb_replace_extension() copies ext, so we have to free it */
- free_HDB_extension(ext);
return 0;
}
int i, k;
int exclude_dead = 0;
KerberosTime now = 0;
+ time_t *set_time;
if ((flags & HDB_F_LIVE_CLNT_KVNOS) || (flags & HDB_F_LIVE_SVC_KVNOS)) {
exclude_dead = 1;
if (exclude_dead &&
((ent->max_life != NULL &&
+ hist_keys->val[i].set_time != NULL &&
hist_keys->val[i].set_time < (now - (*ent->max_life))) ||
(hist_keys->val[i].kvno < kvno &&
(kvno - hist_keys->val[i].kvno) > kvno_diff)))
* so there's no danger that we'll dump this entry and load it
* again, repeatedly causing the history to grow boundelessly.
*/
+ set_time = malloc(*set_time);
+ if (set_time == NULL)
+ return ENOMEM;
tmp_keys = realloc(hist_keys->val,
sizeof (*hist_keys->val) * (hist_keys->len + 1));
if (tmp_keys == NULL)
tmp_keys[0].keys.len = ent->keys.len;
tmp_keys[0].keys.val = ent->keys.val;
tmp_keys[0].kvno = ent->kvno;
- (void) hdb_entry_get_pw_change_time(ent, &tmp_keys[0].set_time);
+ tmp_keys[0].set_time = set_time;
+ (void) hdb_entry_get_pw_change_time(ent, tmp_keys[0].set_time);
i++;
ent->keys.len = hist_keys->val[i].keys.len;
ent->keys.val = hist_keys->val[i].keys.val;