From c76d083d4d5d7b9b0c53e59f4940fc4fd762bdfe Mon Sep 17 00:00:00 2001 From: Aram Sargsyan Date: Tue, 11 Jun 2024 10:57:15 +0000 Subject: [PATCH] Make dns_xfrin_shutdown() safe to run from a different loop If the current loop is different than the zone transfer's loop then run the shutdown operation asynchronously. (cherry picked from commit 3d1179501aa2716c7c8027bbc864ce2185936748) --- lib/dns/xfrin.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/dns/xfrin.c b/lib/dns/xfrin.c index 745c7f58a7..523b59a5a6 100644 --- a/lib/dns/xfrin.c +++ b/lib/dns/xfrin.c @@ -16,6 +16,7 @@ #include #include +#include #include #include #include @@ -1048,11 +1049,26 @@ dns_xfrin_gettsigkeyname(const dns_xfrin_t *xfr) { return (dst_key_name(xfr->tsigkey->key)); } +static void +xfrin_shutdown(void *arg) { + dns_xfrin_t *xfr = arg; + + REQUIRE(VALID_XFRIN(xfr)); + + xfrin_fail(xfr, ISC_R_CANCELED, "shut down"); + dns_xfrin_detach(&xfr); +} + void dns_xfrin_shutdown(dns_xfrin_t *xfr) { REQUIRE(VALID_XFRIN(xfr)); - xfrin_fail(xfr, ISC_R_CANCELED, "shut down"); + if (xfr->loop != isc_loop()) { + dns_xfrin_ref(xfr); + isc_async_run(xfr->loop, xfrin_shutdown, xfr); + } else { + xfrin_fail(xfr, ISC_R_CANCELED, "shut down"); + } } #if DNS_XFRIN_TRACE