From: Arran Cudbard-Bell Date: Sun, 21 Mar 2021 22:27:51 +0000 (+0000) Subject: Allow functions to be top_frames and remove garbage frame in child requests X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=195c7fb9fa385017c621dfdac903f078f632cfe9;p=thirdparty%2Ffreeradius-server.git Allow functions to be top_frames and remove garbage frame in child requests --- diff --git a/src/lib/unlang/function.c b/src/lib/unlang/function.c index b0789f62b94..81c3bb97921 100644 --- a/src/lib/unlang/function.c +++ b/src/lib/unlang/function.c @@ -118,7 +118,7 @@ static unlang_action_t unlang_function_call(rlm_rcode_t *p_result, request_t *re * - -1 on failure. */ int unlang_interpret_push_function(request_t *request, unlang_function_t func, unlang_function_t repeat, - unlang_function_signal_t signal, void *uctx) + unlang_function_signal_t signal, bool top_frame, void *uctx) { unlang_stack_t *stack = request->stack; unlang_stack_frame_t *frame; @@ -128,7 +128,7 @@ int unlang_interpret_push_function(request_t *request, unlang_function_t func, u * Push module's function */ if (unlang_interpret_push(request, &function_instruction, - RLM_MODULE_UNKNOWN, UNLANG_NEXT_STOP, UNLANG_SUB_FRAME) < 0) return -1; + RLM_MODULE_UNKNOWN, UNLANG_NEXT_STOP, top_frame) < 0) return -1; frame = &stack->frame[stack->depth]; diff --git a/src/lib/unlang/function.h b/src/lib/unlang/function.h index a4da0432c89..a46e5997047 100644 --- a/src/lib/unlang/function.h +++ b/src/lib/unlang/function.h @@ -54,7 +54,7 @@ typedef void (*unlang_function_signal_t)(request_t *request, fr_state_signal_t a int unlang_interpret_push_function(request_t *request, unlang_function_t func, unlang_function_t repeat, - unlang_function_signal_t signal, void *uctx) + unlang_function_signal_t signal, bool top_frame, void *uctx) CC_HINT(warn_unused_result); #ifdef __cplusplus diff --git a/src/lib/unlang/parallel.c b/src/lib/unlang/parallel.c index 24666508ab5..2aa6ba227ce 100644 --- a/src/lib/unlang/parallel.c +++ b/src/lib/unlang/parallel.c @@ -336,15 +336,6 @@ static unlang_action_t unlang_parallel_process(rlm_rcode_t *p_result, request_t } } - /* - * Push a top frame, followed by a frame - * which signals us that the child is - * done, followed by the instruction to - * run in the child. - */ - if (unlang_interpret_push(child, NULL, RLM_MODULE_NOOP, - UNLANG_NEXT_STOP, UNLANG_TOP_FRAME) < 0) goto error; - /* * Child starts detached, the parent knows * and can exit immediately once all @@ -386,6 +377,7 @@ static unlang_action_t unlang_parallel_process(rlm_rcode_t *p_result, request_t NULL, unlang_parallel_child_done, unlang_parallel_child_signal, + UNLANG_TOP_FRAME, &state->children[i]) < 0) goto error; child_frame = unlang_current_frame(child); return_point_set(child_frame); /* Don't unwind this frame */ @@ -403,7 +395,8 @@ static unlang_action_t unlang_parallel_process(rlm_rcode_t *p_result, request_t */ if (unlang_interpret_push(child, state->children[i].instruction, RLM_MODULE_FAIL, - UNLANG_NEXT_STOP, UNLANG_SUB_FRAME) < 0) goto error; + UNLANG_NEXT_STOP, + state->detach ? UNLANG_TOP_FRAME : UNLANG_SUB_FRAME) < 0) goto error; } /* diff --git a/src/modules/rlm_eap/types/rlm_eap_tls/rlm_eap_tls.c b/src/modules/rlm_eap/types/rlm_eap_tls/rlm_eap_tls.c index 82c981a2058..d3bde3ceb2f 100644 --- a/src/modules/rlm_eap/types/rlm_eap_tls/rlm_eap_tls.c +++ b/src/modules/rlm_eap/types/rlm_eap_tls/rlm_eap_tls.c @@ -176,7 +176,8 @@ static unlang_action_t eap_tls_virtual_server(rlm_rcode_t *p_result, rlm_eap_tls /* * Catch the interpreter on the way back up the stack */ - if (unlang_interpret_push_function(request, NULL, eap_tls_virtual_server_result, NULL, eap_session) < 0) { + if (unlang_interpret_push_function(request, NULL, eap_tls_virtual_server_result, NULL, + UNLANG_SUB_FRAME, eap_session) < 0) { RETURN_MODULE_FAIL; }