Parent rbtrees correctly
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Wed, 18 Jun 2014 11:28:35 +0000 (12:28 +0100)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Wed, 18 Jun 2014 11:28:35 +0000 (12:28 +0100)
14 files changed:
src/include/libradius.h
src/lib/packet.c
src/lib/rbtree.c
src/main/client.c
src/main/conffile.c
src/main/modules.c
src/main/radclient.c
src/main/radsniff.c
src/main/realms.c
src/main/xlat.c
src/modules/rlm_cache/rlm_cache.c
src/modules/rlm_eap/rlm_eap.c
src/modules/rlm_securid/rlm_securid.c
src/tests/rbmonkey.c

index 827a339..8c438da 100644 (file)
@@ -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);
index 13af027..475f25f 100644 (file)
@@ -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;
index cac330f..5e6de50 100644 (file)
@@ -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;
 
index 335c94e..4888642 100644 (file)
@@ -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
index f392a09..20717ac 100644 (file)
@@ -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);
index 974655e..cce2ea4 100644 (file)
@@ -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");
index cb6195a..04bc729 100644 (file)
@@ -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");
index cc9f46d..912897c 100644 (file)
@@ -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;
index 9aec6bc..c10963e 100644 (file)
@@ -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;
index d12526f..118fe5e 100644 (file)
@@ -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;
index 8f2a9f1..f14b3f4 100644 (file)
@@ -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;
index d462fd5..831e01e 100644 (file)
@@ -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;
index 149eac5..81a39b5 100644 (file)
@@ -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;
index a22d3fa..5eb18da 100644 (file)
@@ -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;