From: Nick Porter Date: Tue, 13 May 2025 13:43:40 +0000 (+0100) Subject: Check that mruby functions exist X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4a20ab91b7beac6df42cfc193b709d07ea515940;p=thirdparty%2Ffreeradius-server.git Check that mruby functions exist --- diff --git a/src/modules/rlm_mruby/rlm_mruby.c b/src/modules/rlm_mruby/rlm_mruby.c index 655b5ce8590..9545797fed8 100644 --- a/src/modules/rlm_mruby/rlm_mruby.c +++ b/src/modules/rlm_mruby/rlm_mruby.c @@ -161,11 +161,16 @@ static void mruby_parse_config(mrb_state *mrb, CONF_SECTION *cs, int lvl, mrb_va */ static int mod_instantiate(module_inst_ctx_t const *mctx) { - rlm_mruby_t *inst = talloc_get_type_abort(mctx->mi->data, rlm_mruby_t); - mrb_state *mrb; - CONF_SECTION *cs; - FILE *f; - mrb_value status; + rlm_mruby_t *inst = talloc_get_type_abort(mctx->mi->data, rlm_mruby_t); + fr_rb_iter_inorder_t iter; + mruby_func_def_t *func = NULL; + mrb_state *mrb; + CONF_SECTION *cs; + FILE *f; + mrb_value status; + char *pair_name; + CONF_PAIR *cp; + mrb_value func_sym; mrb = inst->mrb = mrb_open(); if (!mrb) { @@ -231,6 +236,52 @@ static int mod_instantiate(module_inst_ctx_t const *mctx) return -1; } + if (!inst->funcs_init) fr_rb_inline_init(&inst->funcs, mruby_func_def_t, node, mruby_func_def_cmp, NULL); + func = fr_rb_iter_init_inorder(&iter, &inst->funcs); + while (func) { + /* + * Check for func__ or func_ config pairs. + */ + if (func->name2) { + pair_name = talloc_asprintf(func, "func_%s_%s", func->name1, func->name2); + cp = cf_pair_find(mctx->mi->conf, pair_name); + talloc_free(pair_name); + if (cp) goto found_func; + } + pair_name = talloc_asprintf(func, "func_%s", func->name1); + cp = cf_pair_find(mctx->mi->conf, pair_name); + talloc_free(pair_name); + found_func: + if (cp){ + func->function_name = cf_pair_value(cp); + func_sym = mrb_check_intern_cstr(mrb, func->function_name); + if (mrb_nil_p(func_sym)) { + cf_log_err(cp, "mruby function %s does not exist", func->function_name); + return -1; + } + /* + * If no pair was found, then use _ or as the function to call. + */ + } else if (func->name2) { + func->function_name = talloc_asprintf(func, "%s_%s", func->name1, func->name2); + func_sym = mrb_check_intern_cstr(mrb, func->function_name); + if (mrb_nil_p(func_sym)) { + talloc_const_free(func->function_name); + goto name1_only; + } + } else { + name1_only: + func->function_name = func->name1; + func_sym = mrb_check_intern_cstr(mrb, func->function_name); + if (mrb_nil_p(func_sym)) { + cf_log_err(cp, "mruby function %s does not exist", func->function_name); + return -1; + } + } + + func = fr_rb_iter_next_inorder(&iter); + } + status = mrb_funcall(mrb, mrb_obj_value(inst->mruby_module), "instantiate", 0); if (mrb_undef_p(status)) { ERROR("Running instantiate failed");