From: Evan Hunt Date: Fri, 21 Apr 2017 00:41:37 +0000 (-0700) Subject: [master] fix dispatch.c shutdown race X-Git-Tag: v9.12.0a1~373 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=019132b70c368bc9abca0034d07b324bb7cb6eb2;p=thirdparty%2Fbind9.git [master] fix dispatch.c shutdown race 4952. [bug] A race condition on shutdown could trigger an assertion failure in dispatch.c. [RT #43822] --- diff --git a/CHANGES b/CHANGES index 9f91f992eb2..50cadf5ec54 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 d9554ac634f..4f668a102da 100644 --- a/lib/dns/dispatch.c +++ b/lib/dns/dispatch.c @@ -3721,9 +3721,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 25533907494..c62cad77165 100644 --- a/lib/dns/include/dns/dispatch.h +++ b/lib/dns/include/dns/dispatch.h @@ -533,6 +533,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