]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Poper fix for dynamic instantiation of the cache module
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Sun, 12 May 2024 17:43:05 +0000 (11:43 -0600)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Sun, 12 May 2024 17:43:05 +0000 (11:43 -0600)
src/modules/rlm_cache/rlm_cache.c

index e709de72bf971901945cfc6eb78a30f6e60f2b7b..3a7cb076bc545c7eed5bdd1005b6386a9a7dff25 100644 (file)
@@ -42,12 +42,13 @@ RCSID("$Id$")
 
 extern module_rlm_t rlm_cache;
 
+int submodule_parse(TALLOC_CTX *ctx, void *out, void *parent, CONF_ITEM *ci, conf_parser_t const *rule);
 static int cache_key_parse(TALLOC_CTX *ctx, void *out, tmpl_rules_t const *t_rules, CONF_ITEM *ci, char const *section_name1, char const *section_name2, void const *data, call_env_parser_t const *rule);
 static int cache_update_section_parse(TALLOC_CTX *ctx, call_env_parsed_head_t *out, tmpl_rules_t const *t_rules, CONF_ITEM *ci, char const *section_name1, char const *section_name2, void const *data, call_env_parser_t const *rule);
 
 static const conf_parser_t module_config[] = {
        { FR_CONF_OFFSET_TYPE_FLAGS("driver", FR_TYPE_VOID, 0, rlm_cache_t, driver_submodule), .dflt = "rbtree",
-                        .func = module_rlm_submodule_parse },
+                        .func = submodule_parse },
        { FR_CONF_OFFSET("ttl", rlm_cache_config_t, ttl), .dflt = "500s" },
        { FR_CONF_OFFSET("max_entries", rlm_cache_config_t, max_entries), .dflt = "0" },
 
@@ -102,6 +103,20 @@ fr_dict_attr_autoload_t rlm_cache_dict_attr[] = {
        { NULL }
 };
 
+int submodule_parse(TALLOC_CTX *ctx, void *out, void *parent, CONF_ITEM *ci, conf_parser_t const *rule)
+{
+       rlm_cache_t             *inst = talloc_get_type_abort(parent, rlm_cache_t);
+       module_instance_t       *mi;
+       int ret;
+
+       if (unlikely(ret = module_rlm_submodule_parse(ctx, out, parent, ci, rule) < 0)) return ret;
+
+       mi = talloc_get_type_abort(*((void **)out), module_instance_t);
+       inst->driver = (rlm_cache_driver_t const *)mi->exported; /* Public symbol exported by the submodule */
+
+       return 0;
+}
+
 static int cache_key_parse(TALLOC_CTX *ctx, void *out, tmpl_rules_t const *t_rules, CONF_ITEM *ci,
                           char const *section_name1, char const *section_name2, void const *data,
                           call_env_parser_t const *rule)
@@ -1468,12 +1483,6 @@ static int mod_instantiate(module_inst_ctx_t const *mctx)
 static int mod_bootstrap(module_inst_ctx_t const *mctx)
 {
        xlat_t          *xlat;
-       rlm_cache_t     *inst = talloc_get_type_abort(mctx->mi->data, rlm_cache_t);
-
-       /*
-        *      Needs to be set here for callenv parsing
-        */
-       inst->driver = (rlm_cache_driver_t const *)inst->driver_submodule->exported;
 
        /*
         *      Register the cache xlat function
@@ -1500,7 +1509,6 @@ static int mod_bootstrap(module_inst_ctx_t const *mctx)
 module_rlm_t rlm_cache = {
        .common = {
                .magic          = MODULE_MAGIC_INIT,
-               .flags          = MODULE_TYPE_DYNAMIC_UNSAFE,
                .name           = "cache",
                .inst_size      = sizeof(rlm_cache_t),
                .config         = module_config,