From: Arran Cudbard-Bell Date: Tue, 30 Jan 2018 00:22:49 +0000 (-0700) Subject: Pass a repeat function for going back up the stack X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=33728994bef15f86b3edd501be9b36d4b62fc597;p=thirdparty%2Ffreeradius-server.git Pass a repeat function for going back up the stack --- diff --git a/src/include/modules.h b/src/include/modules.h index a4ae352506a..d5f5a354523 100644 --- a/src/include/modules.h +++ b/src/include/modules.h @@ -311,6 +311,7 @@ int unlang_event_fd_delete(REQUEST *request, void const *ctx, int fd); rlm_rcode_t module_unlang_push_function(REQUEST *request, unlang_function_t func, + unlang_function_t repeat, fr_module_unlang_resume_t resume, fr_module_unlang_signal_t signal, void *rctx); diff --git a/src/include/unlang.h b/src/include/unlang.h index 88750de8b48..d5df048b91d 100644 --- a/src/include/unlang.h +++ b/src/include/unlang.h @@ -118,7 +118,7 @@ typedef struct { ///< in debug mode. } unlang_op_t; -void unlang_push_function(REQUEST *request, unlang_function_t func, void *uctx); +void unlang_push_function(REQUEST *request, unlang_function_t func, unlang_function_t repeat, void *uctx); void unlang_push_section(REQUEST *request, CONF_SECTION *cs, rlm_rcode_t default_action); diff --git a/src/main/module_unlang.c b/src/main/module_unlang.c index 100d65b9137..d07b69d1584 100644 --- a/src/main/module_unlang.c +++ b/src/main/module_unlang.c @@ -229,7 +229,7 @@ static unlang_action_t module_unlang_resume(REQUEST *request, rlm_rcode_t *presu * - RLM_MODULE_YIELD. */ rlm_rcode_t module_unlang_push_function(REQUEST *request, - unlang_function_t func, + unlang_function_t func, unlang_function_t repeat, fr_module_unlang_resume_t resume, fr_module_unlang_signal_t signal, void *rctx) { @@ -238,7 +238,7 @@ rlm_rcode_t module_unlang_push_function(REQUEST *request, */ (void) unlang_module_yield(request, resume, signal, rctx); - unlang_push_function(request, func, rctx); + unlang_push_function(request, func, repeat, rctx); return RLM_MODULE_YIELD; /* This may allow us to do optimisations in future */ } diff --git a/src/main/unlang_op.c b/src/main/unlang_op.c index 5eb0ad05d48..1b3cd2601db 100644 --- a/src/main/unlang_op.c +++ b/src/main/unlang_op.c @@ -90,7 +90,8 @@ static uint64_t unlang_active_callers(unlang_t *instruction) } typedef struct { - unlang_function_t func; //!< To call. + unlang_function_t func; //!< To call when going down the stack. + unlang_function_t repeat; //!< To call when going back up the stack. void *uctx; //!< Uctx to pass to function. } unlang_frame_state_func_t; @@ -129,7 +130,11 @@ static unlang_action_t unlang_function_call(REQUEST *request, unlang_t *instruction = frame->instruction; unlang_action_t ua; - ua = state->func(request, state->uctx); + if (!frame->repeat) { + ua = state->func(request, state->uctx); + } else { + ua = state->repeat(request, state->uctx); + } /* * The success/failure of these functions @@ -151,10 +156,12 @@ static unlang_action_t unlang_function_call(REQUEST *request, * deeper in the C call stack to establish a new resumption point. * * @param[in] request The current request. - * @param[in] func to call. + * @param[in] func to call going up the stack. + * @param[in] repeat function to call going back down the stack (may be NULL). + * This may be the same as #func. * @param[in] uctx to pass to func. */ -void unlang_push_function(REQUEST *request, unlang_function_t func, void *uctx) +void unlang_push_function(REQUEST *request, unlang_function_t func, unlang_function_t repeat, void *uctx) { unlang_stack_t *stack = request->stack; unlang_stack_frame_t *frame; @@ -166,12 +173,19 @@ void unlang_push_function(REQUEST *request, unlang_function_t func, void *uctx) unlang_push(stack, &function_instruction, RLM_MODULE_UNKNOWN, UNLANG_NEXT_STOP, false); frame = &stack->frame[stack->depth]; + /* + * Tell the interpreter to call unlang_function_call + * again when going back up the stack. + */ + if (repeat) frame->repeat = true; + /* * Allocate state */ MEM(frame->state = state = talloc_zero(stack, unlang_frame_state_func_t)); state->func = func; + state->repeat = repeat; state->uctx = uctx; } diff --git a/src/modules/rlm_eap/rlm_eap.c b/src/modules/rlm_eap/rlm_eap.c index a61f711296a..cfd1c0c8895 100644 --- a/src/modules/rlm_eap/rlm_eap.c +++ b/src/modules/rlm_eap/rlm_eap.c @@ -581,7 +581,8 @@ module_call: rctx->rcode = RLM_MODULE_UNKNOWN; request->module = method->submodule->name; - return module_unlang_push_function(request, eap_call_submodule, mod_authenticate_result, NULL, rctx); + return module_unlang_push_function(request, eap_call_submodule, eap_call_submodule, + mod_authenticate_result, NULL, rctx); } static rlm_rcode_t mod_authenticate(void *instance, UNUSED void *thread, REQUEST *request)