use add_HDB_Ext_KeySet and plug memory leak
This commit is contained in:
		@@ -208,66 +208,54 @@ 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)
 | 
				
			||||||
	    free_HDB_extension(ext);
 | 
						    goto out;
 | 
				
			||||||
	    return ret;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	free_HDB_extension(ext);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return 0;
 | 
					
 | 
				
			||||||
 | 
					 out:
 | 
				
			||||||
 | 
					    if (ext) {
 | 
				
			||||||
 | 
						free_HDB_extension(ext);
 | 
				
			||||||
 | 
						if (replace)
 | 
				
			||||||
 | 
						    free(ext);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user