]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Run the forward_cancel on the appropriate zone->loop
authorOndřej Surý <ondrej@isc.org>
Fri, 14 Apr 2023 03:43:53 +0000 (05:43 +0200)
committerOndřej Surý <ondrej@isc.org>
Fri, 14 Apr 2023 14:31:33 +0000 (16:31 +0200)
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.

lib/dns/zone.c

index 5dd59da6467b29288cb318ed1b404e39d073a482..0a7d1d9d5d62cbe603b91ac3400f5c92aef95970 100644 (file)
@@ -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);
                }
        }
 }