From: Nick Porter Date: Mon, 24 Apr 2023 17:38:34 +0000 (+0100) Subject: Add a talloc reference from trunk request to LDAP query. Fixes #4598 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4d34f747c024b69d6b29d22c6990b357ec3e161c;p=thirdparty%2Ffreeradius-server.git Add a talloc reference from trunk request to LDAP query. Fixes #4598 Ensures the LDAP query will last until the trunk request is freed. Specifically, in the case that the packet processing times out and the trunk request is singlalled to be cancelled, the query needs to live until the cancel_mux function is called. --- diff --git a/src/lib/ldap/base.c b/src/lib/ldap/base.c index 37beb0b4d43..01b3f4d5c7e 100644 --- a/src/lib/ldap/base.c +++ b/src/lib/ldap/base.c @@ -699,6 +699,10 @@ unlang_action_t fr_ldap_trunk_search(rlm_rcode_t *p_result, switch (fr_trunk_request_enqueue(&query->treq, ttrunk->trunk, request, query, NULL)) { case FR_TRUNK_ENQUEUE_OK: case FR_TRUNK_ENQUEUE_IN_BACKLOG: + /* + * Ensure the query ctx will last until the trunk request frees its children + */ + talloc_reference(query->treq, query); break; default: @@ -773,6 +777,10 @@ unlang_action_t fr_ldap_trunk_modify(rlm_rcode_t *p_result, switch (fr_trunk_request_enqueue(&query->treq, ttrunk->trunk, request, query, NULL)) { case FR_TRUNK_ENQUEUE_OK: case FR_TRUNK_ENQUEUE_IN_BACKLOG: + /* + * Ensure the query ctx will last until the trunk request frees its children + */ + talloc_reference(query->treq, query); break; default: @@ -866,6 +874,10 @@ unlang_action_t fr_ldap_trunk_extended(rlm_rcode_t *p_result, switch (fr_trunk_request_enqueue(&query->treq, ttrunk->trunk, request, query, NULL)) { case FR_TRUNK_ENQUEUE_OK: case FR_TRUNK_ENQUEUE_IN_BACKLOG: + /* + * Ensure the query ctx will last until the trunk request frees its children + */ + talloc_reference(query->treq, query); break; default: diff --git a/src/lib/ldap/referral.c b/src/lib/ldap/referral.c index 47e90d4f76f..a5d56a98899 100644 --- a/src/lib/ldap/referral.c +++ b/src/lib/ldap/referral.c @@ -82,6 +82,7 @@ static void _ldap_referral_send(UNUSED fr_trunk_t *trunk, UNUSED fr_trunk_state_ switch (fr_trunk_request_enqueue(&query->treq, referral->ttrunk->trunk, request, query, NULL)) { case FR_TRUNK_ENQUEUE_OK: case FR_TRUNK_ENQUEUE_IN_BACKLOG: + talloc_reference(query->treq, query); break; default: @@ -237,6 +238,7 @@ int fr_ldap_referral_follow(fr_ldap_thread_t *t, request_t *request, fr_ldap_que switch (fr_trunk_request_enqueue(&query->treq, ttrunk->trunk, request, query, NULL)) { case FR_TRUNK_ENQUEUE_OK: case FR_TRUNK_ENQUEUE_IN_BACKLOG: + talloc_reference(query->treq, query); break; default: @@ -328,6 +330,7 @@ int fr_ldap_referral_next(fr_ldap_thread_t *t, request_t *request, fr_ldap_query switch(fr_trunk_request_enqueue(&query->treq, ttrunk->trunk, request, query, NULL)) { case FR_TRUNK_ENQUEUE_OK: case FR_TRUNK_ENQUEUE_IN_BACKLOG: + talloc_reference(query->treq, query); break; default: