From: Evan Hunt Date: Fri, 21 Apr 2017 00:42:03 +0000 (-0700) Subject: [v9_10] fix dispatch.c shutdown race X-Git-Tag: v9.10.6b1~125 X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=70590c691b410303ac44f879e0a3b2b58711a3de;p=thirdparty%2Fbind9.git [v9_10] fix dispatch.c shutdown race 4952. [bug] A race condition on shutdown could trigger an assertion failure in dispatch.c. [RT #43822] (cherry picked from commit 019132b70c368bc9abca0034d07b324bb7cb6eb2) --- diff --git a/CHANGES b/CHANGES index baeec24538c..23675c0e998 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +4952. [bug] A race condition on shutdown could trigger an + assertion failure in dispatch.c. [RT #43822] + 4591. [port] Addressed some python 3 compatibility issues. Thanks to Ville Skytta. [RT #44955] [RT #44956] diff --git a/lib/dns/dispatch.c b/lib/dns/dispatch.c index 3371af0baa4..8122a743d85 100644 --- a/lib/dns/dispatch.c +++ b/lib/dns/dispatch.c @@ -3688,9 +3688,12 @@ dns_dispatch_importrecv(dns_dispatch_t *disp, isc_event_t *event) { REQUIRE((disp->attributes & DNS_DISPATCHATTR_NOLISTEN) != 0); REQUIRE(event != NULL); - sevent = (isc_socketevent_t *)event; + if ((disp->attributes & DNS_DISPATCHATTR_NOLISTEN) == 0) + return; + sevent = (isc_socketevent_t *)event; INSIST(sevent->n <= disp->mgr->buffersize); + newsevent = (isc_socketevent_t *) isc_event_allocate(disp->mgr->mctx, NULL, DNS_EVENT_IMPORTRECVDONE, udp_shrecv, diff --git a/lib/dns/include/dns/dispatch.h b/lib/dns/include/dns/dispatch.h index f936f68c345..a692de4ca8a 100644 --- a/lib/dns/include/dns/dispatch.h +++ b/lib/dns/include/dns/dispatch.h @@ -524,6 +524,9 @@ dns_dispatch_importrecv(dns_dispatch_t *disp, isc_event_t *event); * shared between dispatchers and clients. If the dispatcher fails to copy * or send the event, nothing happens. * + * If the attribute DNS_DISPATCHATTR_NOLISTEN is not set, then + * the dispatch is already handling a recv; return immediately. + * * Requires: *\li disp is valid, and the attribute DNS_DISPATCHATTR_NOLISTEN is set. * event != NULL