From: Ondřej Surý Date: Fri, 14 Apr 2023 03:43:53 +0000 (+0200) Subject: Run the forward_cancel on the appropriate zone->loop X-Git-Tag: v9.19.13~31^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3df3b5efbdd5dea902f46c7546ffecf60c13889b;p=thirdparty%2Fbind9.git Run the forward_cancel on the appropriate zone->loop If the zone forwards are canceled from dns_zonemgr_shutdown(), the forward_cancel() would get called from the main loop, which is wrong. It needs to be called from the matching zone->loop. Run the dns_request_cancel() via isc_async_run() on the loop associated with the zone instead of calling the dns_request_cancel() directly from the main loop. --- diff --git a/lib/dns/zone.c b/lib/dns/zone.c index 5dd59da6467..0a7d1d9d5d6 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -11845,6 +11845,13 @@ checkds_cancel(dns_zone_t *zone) { } } +static void +forward_cancel_cb(void *arg) { + dns_request_t *request = arg; + dns_request_cancel(request); + dns_request_detach(&request); +} + static void forward_cancel(dns_zone_t *zone) { dns_forward_t *forward; @@ -11859,7 +11866,9 @@ forward_cancel(dns_zone_t *zone) { forward = ISC_LIST_NEXT(forward, link)) { if (forward->request != NULL) { - dns_request_cancel(forward->request); + dns_request_t *request = NULL; + dns_request_attach(forward->request, &request); + isc_async_run(zone->loop, forward_cancel_cb, request); } } }