diff --git a/CHANGES b/CHANGES index 29506fb8aa..01b269a053 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,7 @@ +5872. [bug] udp_recv() in dispatch could trigger an INSIST when the + callback's result indicated success but the response + was canceled in the meantime. [GL #3300] + 5866. [bug] Work around a jemalloc quirk which could trigger an out-of-memory condition in named over time. [GL #3287] diff --git a/lib/dns/dispatch.c b/lib/dns/dispatch.c index 7544a4dba2..ce605f0c6c 100644 --- a/lib/dns/dispatch.c +++ b/lib/dns/dispatch.c @@ -491,6 +491,8 @@ udp_recv(isc_nmhandle_t *handle, isc_result_t eresult, isc_region_t *region, */ if (ISC_LINK_LINKED(resp, alink)) { response = resp->response; + } else if (eresult == ISC_R_SUCCESS) { + eresult = ISC_R_CANCELED; } if (eresult != ISC_R_SUCCESS) { @@ -503,8 +505,6 @@ udp_recv(isc_nmhandle_t *handle, isc_result_t eresult, isc_region_t *region, goto done; } - INSIST(ISC_LINK_LINKED(resp, alink)); - peer = isc_nmhandle_peeraddr(handle); isc_netaddr_fromsockaddr(&netaddr, &peer);