diff --git a/CHANGES b/CHANGES index 36e492efa4..892fc817f6 100644 --- a/CHANGES +++ b/CHANGES @@ -1,7 +1,10 @@ -5790. [bug] Enforce enqueuing TCP resumeread to prevent the - next read callback from being executed before the - current read callback has finished, and the worker - receive buffer has been marked as "freed". [GL #3079] +5790. [bug] The control channel was incorrectly looking for + ISC_R_CANCELED as a signal that the named is + shutting down. In the dispatch refactoring, + the result code returned from network manager + is now ISC_R_SHUTTINGDOWN. Change the control + channel code to use ISC_R_SHUTTINGDOWN result + code to detect named being shut down. [GL #3079] 5789. [bug] Allow replacing expired zone signatures with signatures created by the KSK. [GL #3049] diff --git a/bin/named/controlconf.c b/bin/named/controlconf.c index 3a276cdca2..2d7bcd8f60 100644 --- a/bin/named/controlconf.c +++ b/bin/named/controlconf.c @@ -231,7 +231,7 @@ control_senddone(isc_nmhandle_t *handle, isc_result_t result, void *arg) { } if (atomic_load_acquire(&listener->controls->shuttingdown) || - result == ISC_R_CANCELED) + result == ISC_R_SHUTTINGDOWN) { goto cleanup_sendhandle; } else if (result != ISC_R_SUCCESS) { @@ -414,7 +414,7 @@ control_recvmessage(isc_nmhandle_t *handle, isc_result_t result, void *arg) { } if (result != ISC_R_SUCCESS) { - if (result == ISC_R_SHUTTINGDOWN || result == ISC_R_CANCELED) { + if (result == ISC_R_SHUTTINGDOWN) { atomic_store_release(&listener->controls->shuttingdown, true); } else if (result != ISC_R_EOF) { @@ -630,7 +630,7 @@ control_newconn(isc_nmhandle_t *handle, isc_result_t result, void *arg) { isc_sockaddr_t peeraddr; if (result != ISC_R_SUCCESS) { - if (result == ISC_R_CANCELED) { + if (result == ISC_R_SHUTTINGDOWN) { shutdown_listener(listener); } return (result); diff --git a/doc/notes/notes-current.rst b/doc/notes/notes-current.rst index abb1d94d86..ebaf3ebeda 100644 --- a/doc/notes/notes-current.rst +++ b/doc/notes/notes-current.rst @@ -55,6 +55,5 @@ Bug Fixes after ``named`` restart in case the unsigned zone file gets modified while ``named`` is not running. This has been fixed. :gl:`#3071` -- Under certain circumstances, reading from the raw TCP channels used - for rndc and statistics could cause assertion failure. This has been - fixed. :gl:`#3079` +- Using ``rndc`` on a busy recursive server could cause the ``named`` to abort + with assertion failure. This has been fixed. :gl:`#3079` diff --git a/lib/isccc/ccmsg.c b/lib/isccc/ccmsg.c index a2d4ad3d4c..9ee48ab9c0 100644 --- a/lib/isccc/ccmsg.c +++ b/lib/isccc/ccmsg.c @@ -51,17 +51,22 @@ recv_data(isc_nmhandle_t *handle, isc_result_t eresult, isc_region_t *region, INSIST(VALID_CCMSG(ccmsg)); - if (eresult == ISC_R_CANCELED || eresult == ISC_R_EOF) { + switch (eresult) { + case ISC_R_SHUTTINGDOWN: + case ISC_R_CANCELED: + case ISC_R_EOF: ccmsg->result = eresult; goto done; - } else if (region == NULL && eresult == ISC_R_SUCCESS) { - ccmsg->result = ISC_R_EOF; - goto done; - } else if (eresult != ISC_R_SUCCESS) { + case ISC_R_SUCCESS: + if (region == NULL) { + ccmsg->result = ISC_R_EOF; + goto done; + } + ccmsg->result = ISC_R_SUCCESS; + break; + default: ccmsg->result = eresult; goto done; - } else { - ccmsg->result = eresult; } if (!ccmsg->length_received) {