]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
call rbtree(delete order) to free modules
authorAlan T. DeKok <aland@freeradius.org>
Tue, 14 May 2019 18:47:08 +0000 (14:47 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Tue, 14 May 2019 19:14:34 +0000 (15:14 -0400)
and set flags so that the verification routines don't look up
the module as we're deleting it

src/lib/server/module.c

index 4757d22de519b469ac9d95a1de7d92d1905ff299..8fbbac4e98282dcb53c2336a67187909f15a785a 100644 (file)
@@ -1108,19 +1108,26 @@ void module_free(module_instance_t *mi)
        talloc_free(mi);
 }
 
+
+static int _module_instance_free_walker(void *data, UNUSED void *uctx)
+{
+       module_instance_t *mi = data;
+
+       mi->in_name_tree = false; /* about to be deleted */
+       talloc_free(mi);
+       return 2;
+}
+
+
 /** Free all modules loaded by the server
  */
 void modules_free(void)
 {
-       module_instance_t **inst = NULL;
-       size_t len, i;
-
-       rbtree_flatten(NULL, (void ***)&inst, module_instance_name_tree, RBTREE_IN_ORDER);
-       len = talloc_array_length(inst);
-       for (i = 0; i < len; i++) talloc_free(inst[(len - i) - 1]);
-       talloc_free(inst);
+       if (module_instance_name_tree) {
+               rbtree_walk(module_instance_name_tree, RBTREE_DELETE_ORDER, _module_instance_free_walker, NULL);
+               TALLOC_FREE(module_instance_name_tree);
+       }
 
-       TALLOC_FREE(module_instance_name_tree);
        TALLOC_FREE(module_instance_data_tree);
        TALLOC_FREE(instance_ctx);
 }