From: Aram Sargsyan Date: Tue, 11 Jun 2024 10:57:15 +0000 (+0000) Subject: Make dns_xfrin_shutdown() safe to run from a different loop X-Git-Tag: alessio/regression/026024a6ae~12^2~2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3d1179501aa2716c7c8027bbc864ce2185936748;p=thirdparty%2Fbind9.git 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. --- diff --git a/lib/dns/xfrin.c b/lib/dns/xfrin.c index 745c7f58a7c..523b59a5a65 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