From: Alan T. DeKok Date: Tue, 14 May 2019 18:47:08 +0000 (-0400) Subject: call rbtree(delete order) to free modules X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cfd75ffffc1f90e5b6b63a5682c74dc48fffcec3;p=thirdparty%2Ffreeradius-server.git call rbtree(delete order) to free modules and set flags so that the verification routines don't look up the module as we're deleting it --- diff --git a/src/lib/server/module.c b/src/lib/server/module.c index 4757d22de51..8fbbac4e982 100644 --- a/src/lib/server/module.c +++ b/src/lib/server/module.c @@ -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); }