Make changes to hdb_keyset type be backward-compatible.
This commit is contained in:
		| @@ -91,7 +91,7 @@ HDB-Ext-Aliases ::= SEQUENCE { | ||||
| 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 | ||||
| 	... | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -227,7 +227,7 @@ hdb_add_current_keys_to_history(krb5_context context, hdb_entry *entry) | ||||
|     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) { | ||||
| @@ -240,7 +240,7 @@ hdb_add_current_keys_to_history(krb5_context context, hdb_entry *entry) | ||||
| 	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; | ||||
| @@ -265,19 +265,22 @@ hdb_add_current_keys_to_history(krb5_context context, hdb_entry *entry) | ||||
| 	} | ||||
|     } | ||||
|     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; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -495,6 +495,7 @@ hdb_unseal_keys_kvno(krb5_context context, HDB *db, krb5_kvno kvno, | ||||
|     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; | ||||
| @@ -523,6 +524,7 @@ hdb_unseal_keys_kvno(krb5_context context, HDB *db, krb5_kvno kvno, | ||||
|  | ||||
| 	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))) | ||||
| @@ -573,6 +575,9 @@ hdb_unseal_keys_kvno(krb5_context context, HDB *db, krb5_kvno kvno, | ||||
| 	 * 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) | ||||
| @@ -583,7 +588,8 @@ hdb_unseal_keys_kvno(krb5_context context, HDB *db, krb5_kvno kvno, | ||||
| 	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; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Nicolas Williams
					Nicolas Williams