]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Free detached requests when they're done
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Mon, 29 Mar 2021 10:22:11 +0000 (11:22 +0100)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Wed, 31 Mar 2021 15:11:50 +0000 (16:11 +0100)
src/lib/unlang/interpret_synchronous.c

index 9207d8f1b8014a221690305e2ec39bb6a5455249..d663678ec97243d8ba56f87869a2244189ece26f 100644 (file)
@@ -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,