From 019132b70c368bc9abca0034d07b324bb7cb6eb2 Mon Sep 17 00:00:00 2001 From: Evan Hunt Date: Thu, 20 Apr 2017 17:41:37 -0700 Subject: [PATCH] [master] fix dispatch.c shutdown race 4952. [bug] A race condition on shutdown could trigger an assertion failure in dispatch.c. [RT #43822] --- CHANGES | 3 +++ lib/dns/dispatch.c | 5 ++++- lib/dns/include/dns/dispatch.h | 3 +++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 9f91f992eb..50cadf5ec5 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 d9554ac634..4f668a102d 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 2553390749..c62cad7716 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