From: Arran Cudbard-Bell Date: Wed, 18 Jun 2014 11:28:35 +0000 (+0100) Subject: Parent rbtrees correctly X-Git-Tag: release_3_0_4_rc2~273 X-Git-Url: http://www.project-moonshot.org/gitweb/?a=commitdiff_plain;h=dac4da4ee5a087b69cbdfb6d3db751614e4a9a58;p=freeradius.git Parent rbtrees correctly --- diff --git a/src/include/libradius.h b/src/include/libradius.h index 827a339..8c438da 100644 --- a/src/include/libradius.h +++ b/src/include/libradius.h @@ -786,7 +786,7 @@ typedef int (*rb_comparator_t)(void const *ctx, void const *data); typedef int (*rb_walker_t)(void *ctx, void *data); typedef void (*rb_free_t)(void *data); -rbtree_t *rbtree_create(rb_comparator_t compare, rb_free_t node_free, int flags); +rbtree_t *rbtree_create(TALLOC_CTX *ctx, rb_comparator_t compare, rb_free_t node_free, int flags); void rbtree_free(rbtree_t *tree); bool rbtree_insert(rbtree_t *tree, void *data); rbnode_t *rbtree_insert_node(rbtree_t *tree, void *data); diff --git a/src/lib/packet.c b/src/lib/packet.c index 13af027..475f25f 100644 --- a/src/lib/packet.c +++ b/src/lib/packet.c @@ -465,7 +465,7 @@ fr_packet_list_t *fr_packet_list_create(int alloc_id) if (!pl) return NULL; memset(pl, 0, sizeof(*pl)); - pl->tree = rbtree_create(packet_entry_cmp, NULL, 0); + pl->tree = rbtree_create(NULL, packet_entry_cmp, NULL, 0); if (!pl->tree) { fr_packet_list_free(pl); return NULL; diff --git a/src/lib/rbtree.c b/src/lib/rbtree.c index cac330f..5e6de50 100644 --- a/src/lib/rbtree.c +++ b/src/lib/rbtree.c @@ -107,7 +107,7 @@ void rbtree_free(rbtree_t *tree) /** Create a new RED-BLACK tree * */ -rbtree_t *rbtree_create(rb_comparator_t compare, rb_free_t node_free, int flags) +rbtree_t *rbtree_create(TALLOC_CTX *ctx, rb_comparator_t compare, rb_free_t node_free, int flags) { rbtree_t *tree; diff --git a/src/main/client.c b/src/main/client.c index 335c94e..4888642 100644 --- a/src/main/client.c +++ b/src/main/client.c @@ -219,7 +219,7 @@ int client_add(RADCLIENT_LIST *clients, RADCLIENT *client) * Create a tree for it. */ if (!clients->trees[client->ipaddr.prefix]) { - clients->trees[client->ipaddr.prefix] = rbtree_create(client_ipaddr_cmp, NULL, 0); + clients->trees[client->ipaddr.prefix] = rbtree_create(clients, client_ipaddr_cmp, NULL, 0); if (!clients->trees[client->ipaddr.prefix]) { return 0; } @@ -271,7 +271,7 @@ int client_add(RADCLIENT_LIST *clients, RADCLIENT *client) #ifdef WITH_STATS if (!tree_num) { - tree_num = rbtree_create(client_num_cmp, NULL, 0); + tree_num = rbtree_create(clients, client_num_cmp, NULL, 0); } #ifdef WITH_DYNAMIC_CLIENTS diff --git a/src/main/conffile.c b/src/main/conffile.c index f392a09..20717ac 100644 --- a/src/main/conffile.c +++ b/src/main/conffile.c @@ -359,7 +359,7 @@ CONF_SECTION *cf_section_alloc(CONF_SECTION *parent, char const *name1, if (!cs->name2) goto error; } - cs->pair_tree = rbtree_create(pair_cmp, NULL, 0); + cs->pair_tree = rbtree_create(cs, pair_cmp, NULL, 0); if (!cs->pair_tree) goto error; talloc_set_destructor((void *) cs, cf_section_free); @@ -454,7 +454,7 @@ static void cf_item_add(CONF_SECTION *cs, CONF_ITEM *ci) CONF_SECTION *name1_cs; if (!cs->section_tree) { - cs->section_tree = rbtree_create(section_cmp, NULL, 0); + cs->section_tree = rbtree_create(cs, section_cmp, NULL, 0); if (!cs->section_tree) { ERROR("Out of memory"); fr_exit_now(1); @@ -497,8 +497,7 @@ static void cf_item_add(CONF_SECTION *cs, CONF_ITEM *ci) * sub-section based on name2. */ if (!name1_cs->name2_tree) { - name1_cs->name2_tree = rbtree_create(name2_cmp, - NULL, 0); + name1_cs->name2_tree = rbtree_create(name1_cs, name2_cmp, NULL, 0); if (!name1_cs->name2_tree) { ERROR("Out of memory"); fr_exit_now(1); @@ -519,7 +518,7 @@ static void cf_item_add(CONF_SECTION *cs, CONF_ITEM *ci) case CONF_ITEM_DATA: if (!cs->data_tree) { - cs->data_tree = rbtree_create(data_cmp, NULL, 0); + cs->data_tree = rbtree_create(cs, data_cmp, NULL, 0); } if (cs->data_tree) { rbtree_insert(cs->data_tree, ci); diff --git a/src/main/modules.c b/src/main/modules.c index 974655e..cce2ea4 100644 --- a/src/main/modules.c +++ b/src/main/modules.c @@ -1081,17 +1081,15 @@ static int load_byserver(CONF_SECTION *cs) cf_section_filename(cs)); } - components = rbtree_create(indexed_modcallable_cmp, NULL, 0); - if (!components) { - ERROR("Failed to initialize components\n"); - goto error; - } - server = talloc_zero(cs, virtual_server_t); server->name = name; server->created = time(NULL); server->cs = cs; - server->components = components; + server->components = components = rbtree_create(server, indexed_modcallable_cmp, NULL, 0); + if (!components) { + ERROR("Failed to initialize components"); + goto error; + } talloc_set_destructor(server, virtual_server_free); /* @@ -1554,13 +1552,13 @@ int modules_init(CONF_SECTION *config) /* * Set up the internal module struct. */ - module_tree = rbtree_create(module_entry_cmp, NULL, 0); + module_tree = rbtree_create(NULL, module_entry_cmp, NULL, 0); if (!module_tree) { ERROR("Failed to initialize modules\n"); return -1; } - instance_tree = rbtree_create(module_instance_cmp, + instance_tree = rbtree_create(NULL, module_instance_cmp, module_instance_free, 0); if (!instance_tree) { ERROR("Failed to initialize modules\n"); diff --git a/src/main/radclient.c b/src/main/radclient.c index cb6195a..04bc729 100644 --- a/src/main/radclient.c +++ b/src/main/radclient.c @@ -1139,7 +1139,7 @@ int main(int argc, char **argv) talloc_set_log_stderr(); - filename_tree = rbtree_create(filename_cmp, NULL, 0); + filename_tree = rbtree_create(NULL, filename_cmp, NULL, 0); if (!filename_tree) { oom: ERROR("Out of memory"); diff --git a/src/main/radsniff.c b/src/main/radsniff.c index cc9f46d..912897c 100644 --- a/src/main/radsniff.c +++ b/src/main/radsniff.c @@ -2176,7 +2176,7 @@ int main(int argc, char *argv[]) usage(64); } - link_tree = rbtree_create((rbcmp) rs_rtx_cmp, _unmark_link, 0); + link_tree = rbtree_create(conf, (rbcmp) rs_rtx_cmp, _unmark_link, 0); if (!link_tree) { ERROR("Failed creating RTX tree"); goto finish; @@ -2240,7 +2240,7 @@ int main(int argc, char *argv[]) /* * Setup the request tree */ - request_tree = rbtree_create((rbcmp) rs_packet_cmp, _unmark_request, 0); + request_tree = rbtree_create(conf, (rbcmp) rs_packet_cmp, _unmark_request, 0); if (!request_tree) { ERROR("Failed creating request tree"); goto finish; diff --git a/src/main/realms.c b/src/main/realms.c index 9aec6bc..c10963e 100644 --- a/src/main/realms.c +++ b/src/main/realms.c @@ -1765,34 +1765,34 @@ int realms_init(CONF_SECTION *config) if (realms_byname) return 1; - realms_byname = rbtree_create(realm_name_cmp, free, 0); + realms_byname = rbtree_create(NULL, realm_name_cmp, free, 0); if (!realms_byname) { realms_free(); return 0; } #ifdef WITH_PROXY - home_servers_byaddr = rbtree_create(home_server_addr_cmp, home_server_free, 0); + home_servers_byaddr = rbtree_create(NULL, home_server_addr_cmp, home_server_free, 0); if (!home_servers_byaddr) { realms_free(); return 0; } - home_servers_byname = rbtree_create(home_server_name_cmp, NULL, 0); + home_servers_byname = rbtree_create(NULL, home_server_name_cmp, NULL, 0); if (!home_servers_byname) { realms_free(); return 0; } #ifdef WITH_STATS - home_servers_bynumber = rbtree_create(home_server_number_cmp, NULL, 0); + home_servers_bynumber = rbtree_create(NULL, home_server_number_cmp, NULL, 0); if (!home_servers_bynumber) { realms_free(); return 0; } #endif - home_pools_byname = rbtree_create(home_pool_name_cmp, NULL, 0); + home_pools_byname = rbtree_create(NULL, home_pool_name_cmp, NULL, 0); if (!home_pools_byname) { realms_free(); return 0; diff --git a/src/main/xlat.c b/src/main/xlat.c index d12526f..118fe5e 100644 --- a/src/main/xlat.c +++ b/src/main/xlat.c @@ -574,7 +574,7 @@ int xlat_register(char const *name, RAD_XLAT_FUNC func, RADIUS_ESCAPE_STRING esc int i; #endif - xlat_root = rbtree_create(xlat_cmp, free, 0); + xlat_root = rbtree_create(NULL, xlat_cmp, free, 0); if (!xlat_root) { DEBUG("xlat_register: Failed to create tree"); return -1; diff --git a/src/modules/rlm_cache/rlm_cache.c b/src/modules/rlm_cache/rlm_cache.c index 8f2a9f1..f14b3f4 100644 --- a/src/modules/rlm_cache/rlm_cache.c +++ b/src/modules/rlm_cache/rlm_cache.c @@ -667,7 +667,7 @@ static int mod_instantiate(CONF_SECTION *conf, void *instance) /* * The cache. */ - inst->cache = rbtree_create(cache_entry_cmp, cache_entry_free, 0); + inst->cache = rbtree_create(inst, cache_entry_cmp, cache_entry_free, 0); if (!inst->cache) { ERROR("Failed to create cache"); return -1; diff --git a/src/modules/rlm_eap/rlm_eap.c b/src/modules/rlm_eap/rlm_eap.c index d462fd5..831e01e 100644 --- a/src/modules/rlm_eap/rlm_eap.c +++ b/src/modules/rlm_eap/rlm_eap.c @@ -226,14 +226,14 @@ static int mod_instantiate(CONF_SECTION *cs, void *instance) * Lookup sessions in the tree. We don't free them in * the tree, as that's taken care of elsewhere... */ - inst->session_tree = rbtree_create(eap_handler_cmp, NULL, 0); + inst->session_tree = rbtree_create(inst, eap_handler_cmp, NULL, 0); if (!inst->session_tree) { ERROR("rlm_eap (%s): Cannot initialize tree", inst->xlat_name); return -1; } if (fr_debug_flag) { - inst->handler_tree = rbtree_create(eap_handler_ptr_cmp, NULL, 0); + inst->handler_tree = rbtree_create(inst, eap_handler_ptr_cmp, NULL, 0); if (!inst->handler_tree) { ERROR("rlm_eap (%s): Cannot initialize tree", inst->xlat_name); return -1; diff --git a/src/modules/rlm_securid/rlm_securid.c b/src/modules/rlm_securid/rlm_securid.c index 149eac5..81a39b5 100644 --- a/src/modules/rlm_securid/rlm_securid.c +++ b/src/modules/rlm_securid/rlm_securid.c @@ -436,7 +436,7 @@ static int mod_instantiate(UNUSED CONF_SECTION *conf, void *instance) * Lookup sessions in the tree. We don't free them in * the tree, as that's taken care of elsewhere... */ - inst->session_tree = rbtree_create(securid_session_cmp, NULL, 0); + inst->session_tree = rbtree_create(inst, securid_session_cmp, NULL, 0); if (!inst->session_tree) { ERROR("rlm_securid: Cannot initialize session tree"); return -1; diff --git a/src/tests/rbmonkey.c b/src/tests/rbmonkey.c index a22d3fa..5eb18da 100644 --- a/src/tests/rbmonkey.c +++ b/src/tests/rbmonkey.c @@ -186,7 +186,7 @@ again: nextseed, thresh, mask, n); nextseed = rand(); - t = rbtree_create(comp, free, RBTREE_FLAG_LOCK); + t = rbtree_create(NULL, comp, free, RBTREE_FLAG_LOCK); /* Find out the value of the NIL node */ NIL = t->root->left;