]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Fix init/free callback priority sorting
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Fri, 11 Jun 2021 16:10:56 +0000 (11:10 -0500)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Fri, 11 Jun 2021 16:11:10 +0000 (11:11 -0500)
src/lib/server/dl_module.c
src/lib/server/dl_module.h
src/lib/util/dl.c

index 727c1ed334d4280ede6d6e1a5ec58c18750b5084..d9b36408af9d676249ea8f0bad780fbd3f4c9fcb 100644 (file)
@@ -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,
index 25f532b58cf581c3dd32931f14d1a0c195acd4a5..dc33e0e08ae5a5512793982e8b67ee30331f470d 100644 (file)
@@ -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);
 
index faed56eb3bbe09ad442bf3fec8b1142748ea9718..2df38cdb3b131e78ad34c3d34a95fb47ac9ac2fa 100644 (file)
@@ -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;
 }