From: Michał Kępień Date: Tue, 14 Jun 2022 11:13:32 +0000 (+0200) Subject: Ensure ns_query_cancel() handles all recursions X-Git-Tag: v9.19.3~48^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=95e703121db434eb6d7c5bb3611712b4f8f4f029;p=thirdparty%2Fbind9.git Ensure ns_query_cancel() handles all recursions Previously, multiple code paths reused client->query.fetch, so it was enough for ns_query_cancel() to issue a single call to dns_resolver_cancelfetch() with that fetch as an argument. Now, since each slot in the 'recursions' array can hold a reference to a separate resolver fetch, ns_query_cancel() needs to handle all of them, so that all recursion callbacks get a chance to clean up the associated resources when a query is canceled. --- diff --git a/lib/ns/query.c b/lib/ns/query.c index 17bfcd3ee7f..0504bb021c0 100644 --- a/lib/ns/query.c +++ b/lib/ns/query.c @@ -660,9 +660,12 @@ ns_query_cancel(ns_client_t *client) { REQUIRE(NS_CLIENT_VALID(client)); LOCK(&client->query.fetchlock); - if (FETCH_RECTYPE_NORMAL(client) != NULL) { - dns_resolver_cancelfetch(FETCH_RECTYPE_NORMAL(client)); - FETCH_RECTYPE_NORMAL(client) = NULL; + for (int i = 0; i < RECTYPE_COUNT; i++) { + dns_fetch_t **fetchp = &client->query.recursions[i].fetch; + if (*fetchp != NULL) { + dns_resolver_cancelfetch(*fetchp); + *fetchp = NULL; + } } if (client->query.hookactx != NULL) { client->query.hookactx->cancel(client->query.hookactx);