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