From: Arran Cudbard-Bell Date: Fri, 11 Jun 2021 16:10:56 +0000 (-0500) Subject: Fix init/free callback priority sorting X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ff933255705b8b9934074ef87b55828582e07683;p=thirdparty%2Ffreeradius-server.git Fix init/free callback priority sorting --- diff --git a/src/lib/server/dl_module.c b/src/lib/server/dl_module.c index 727c1ed334d..d9b36408af9 100644 --- a/src/lib/server/dl_module.c +++ b/src/lib/server/dl_module.c @@ -685,7 +685,7 @@ dl_module_loader_t *dl_module_loader_init(char const *lib_dir) * Register dictionary autoload callbacks */ dl_symbol_init_cb_register(dl_module_loader->dl_loader, - DL_PRIORITY_DICT_ATTR, "dict_enum", fr_dl_dict_enum_autoload, NULL); + DL_PRIORITY_DICT_ENUM, "dict_enum", fr_dl_dict_enum_autoload, NULL); dl_symbol_init_cb_register(dl_module_loader->dl_loader, DL_PRIORITY_DICT_ATTR, "dict_attr", fr_dl_dict_attr_autoload, NULL); dl_symbol_init_cb_register(dl_module_loader->dl_loader, diff --git a/src/lib/server/dl_module.h b/src/lib/server/dl_module.h index 25f532b58cf..dc33e0e08ae 100644 --- a/src/lib/server/dl_module.h +++ b/src/lib/server/dl_module.h @@ -65,7 +65,8 @@ typedef enum { * The higher the priority, the earlier in callback gets called. */ #define DL_PRIORITY_DICT 30 //!< Callback priority for dictionary autoloading -#define DL_PRIORITY_DICT_ATTR 20 //!< Callback priority for attribute resolution +#define DL_PRIORITY_DICT_ATTR 29 //!< Callback priority for attribute resolution +#define DL_PRIORITY_DICT_ENUM 28 //!< Callback priority for enum resolution #define DL_PRIORITY_BOOTSTRAP 10 //!< Callback priority for bootstrap callback typedef struct dl_module_loader_s dl_module_loader_t; @@ -154,14 +155,6 @@ struct dl_module_instance_s { extern fr_table_num_sorted_t const dl_module_type_prefix[]; extern size_t dl_module_type_prefix_len; -/** Callback priorities - * - * The higher the priority, the earlier in callback gets called. - */ -#define DL_PRIORITY_DICT 30 //!< Callback priority for dictionary autoloading -#define DL_PRIORITY_DICT_ATTR 20 //!< Callback priority for attribute resolution -#define DL_PRIORITY_BOOTSTRAP 10 //!< Callback priority for bootstrap callback - dl_module_t const *dl_module(CONF_SECTION *conf, dl_module_t const *parent, char const *name, dl_module_type_t type); diff --git a/src/lib/util/dl.c b/src/lib/util/dl.c index faed56eb3bb..2df38cdb3b1 100644 --- a/src/lib/util/dl.c +++ b/src/lib/util/dl.c @@ -310,7 +310,7 @@ static int dl_symbol_free(dl_loader_t *dl_loader, dl_t const *dl) int dl_symbol_init_cb_register(dl_loader_t *dl_loader, unsigned int priority, char const *symbol, dl_onload_t func, void *uctx) { - dl_symbol_init_t *n, *p = NULL; + dl_symbol_init_t *n; dl_symbol_init_cb_unregister(dl_loader, symbol, func); @@ -323,12 +323,14 @@ int dl_symbol_init_cb_register(dl_loader_t *dl_loader, unsigned int priority, .uctx = uctx }; - while ((p = fr_dlist_next(&dl_loader->sym_init, p)) && (p->priority >= priority)); - if (p) { - fr_dlist_insert_after(&dl_loader->sym_init, p, n); - } else { - fr_dlist_insert_tail(&dl_loader->sym_init, n); + fr_dlist_foreach(&dl_loader->sym_init, dl_symbol_init_t, p) { + if (p->priority < priority) { + fr_dlist_insert_before(&dl_loader->sym_init, p, n); + n = NULL; + break; + } } + if (n) fr_dlist_insert_tail(&dl_loader->sym_init, n); return 0; } @@ -371,7 +373,7 @@ void dl_symbol_init_cb_unregister(dl_loader_t *dl_loader, char const *symbol, dl int dl_symbol_free_cb_register(dl_loader_t *dl_loader, unsigned int priority, char const *symbol, dl_unload_t func, void *uctx) { - dl_symbol_free_t *n, *p = NULL; + dl_symbol_free_t *n; dl_symbol_free_cb_unregister(dl_loader, symbol, func); @@ -385,12 +387,14 @@ int dl_symbol_free_cb_register(dl_loader_t *dl_loader, unsigned int priority, .uctx = uctx }; - while ((p = fr_dlist_next(&dl_loader->sym_free, p)) && (p->priority >= priority)); - if (p) { - fr_dlist_insert_after(&dl_loader->sym_free, p, n); - } else { - fr_dlist_insert_tail(&dl_loader->sym_free, n); + fr_dlist_foreach(&dl_loader->sym_free, dl_symbol_free_t, p) { + if (p->priority < priority) { + fr_dlist_insert_before(&dl_loader->sym_free, p, n); + n = NULL; + break; + } } + if (n) fr_dlist_insert_tail(&dl_loader->sym_free, n); return 0; }