From: Alan T. DeKok Date: Fri, 19 Mar 2021 12:37:34 +0000 (-0400) Subject: create fake module instance for process functions X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4c4d9499fba817a113abbfa07bed5ed5515d7ce3;p=thirdparty%2Ffreeradius-server.git create fake module instance for process functions and start off real modules at number 1, so that the fake module instances don't interact with real ones --- diff --git a/src/lib/server/virtual_servers.c b/src/lib/server/virtual_servers.c index 88c3d6e9d93..638aef8eb68 100644 --- a/src/lib/server/virtual_servers.c +++ b/src/lib/server/virtual_servers.c @@ -492,6 +492,12 @@ static int server_parse(UNUSED TALLOC_CTX *ctx, void *out, UNUSED void *parent, return 0; } +static unlang_action_t null_method(UNUSED rlm_rcode_t *p_result, UNUSED module_ctx_t const *mctx, UNUSED request_t *request) +{ + RETURN_MODULE_OK; +} + + /** Set the request processing function. * * Short-term hack @@ -501,18 +507,40 @@ void virtual_server_entry_point_set(request_t *request) fr_virtual_server_t *server; fr_process_module_t const *process; fr_io_track_t *track = request->async->packet_ctx; + module_instance_t *mi = talloc_zero(request, module_instance_t); server = cf_data_value(cf_data_find(request->server_cs, fr_virtual_server_t, "vs")); if (!server) return; + mi->name = server->process_module->name; + if (unlikely(track && track->dynamic && server->dynamic_client_module)) { process = (fr_process_module_t const *) server->dynamic_client_module->module->common; + request->async->process = process->process; + request->async->process_inst = server->dynamic_client_module->data; + mi->dl_inst = server->dynamic_client_module; + } else { process = (fr_process_module_t const *) server->process_module->module->common; + request->async->process = process->process; + request->async->process_inst = server->process_module->data; + mi->dl_inst = server->process_module; } - request->async->process = process->process; - request->async->process_inst = server->process_module->data; + mi->instantiated = true; + + /* + * Bootstrap the stack with a module instance. + * + * @todo - src/lib/unlang/module.c calls module_thread(), + * which looks up mi->number in various data structures. + * It's probably best to initialize instance_num=1 in + * src/lib/server/module.c, that reserves 0 for "nothing + * is initialized". + */ + if (unlang_module_push(&request->rcode, request, mi, null_method, true) < 0) { + fr_assert(0); + } } /** Allow dynamic clients in this virtual server.