From: Arran Cudbard-Bell Date: Mon, 29 Mar 2021 10:22:11 +0000 (+0100) Subject: Free detached requests when they're done X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3d7edc745a8f74f8f6db323784501f35c6fad4bd;p=thirdparty%2Ffreeradius-server.git Free detached requests when they're done --- diff --git a/src/lib/unlang/interpret_synchronous.c b/src/lib/unlang/interpret_synchronous.c index 9207d8f1b80..d663678ec97 100644 --- a/src/lib/unlang/interpret_synchronous.c +++ b/src/lib/unlang/interpret_synchronous.c @@ -37,7 +37,7 @@ typedef struct { /** Internal request (i.e. one generated by the interpreter) is now complete * */ -static void _request_internal_init(request_t *request, void *uctx) +static void _request_init_internal(request_t *request, void *uctx) { unlang_interpret_synchronous_t *intps = uctx; @@ -49,15 +49,21 @@ static void _request_internal_init(request_t *request, void *uctx) /** Internal request (i.e. one generated by the interpreter) is now complete * */ -static void _request_internal_done(request_t *request, UNUSED rlm_rcode_t rcode, UNUSED void *uctx) +static void _request_done_internal(request_t *request, UNUSED rlm_rcode_t rcode, UNUSED void *uctx) { RDEBUG3("Done synchronous request"); + + /* + * Detached requests have to be freed by us + * as nothing else can free them. + */ + if (!request->parent) talloc_free(request); } /** External request is now complete * */ -static void _request_external_done(request_t *request, UNUSED rlm_rcode_t rcode, UNUSED void *uctx) +static void _request_done_external(request_t *request, UNUSED rlm_rcode_t rcode, UNUSED void *uctx) { /* * If we're running a real request, then the final @@ -125,9 +131,9 @@ static unlang_interpret_synchronous_t *unlang_interpret_synchronous_alloc(TALLOC } MEM(intps->intp = unlang_interpret_init(intps, intps->el, &(unlang_request_func_t){ - .init_internal = _request_internal_init, - .done_internal = _request_internal_done, - .done_external = _request_external_done, + .init_internal = _request_init_internal, + .done_internal = _request_done_internal, + .done_external = _request_done_external, .mark_runnable = _request_runnable, .yield = _request_yield, .resume = _request_resume,