diff --git a/bin/named/controlconf.c b/bin/named/controlconf.c index ae69d22ee0..46b7ab8928 100644 --- a/bin/named/controlconf.c +++ b/bin/named/controlconf.c @@ -419,10 +419,10 @@ conn_shutdown(controlconnection_t *conn) { conn->shuttingdown = true; /* - * Calling invalidate on ccmsg will shutdown the TCP connection, thus - * we are making sure that no read callback will be called ever again. + * Close the TCP connection to make sure that no read callback will be + * called for it ever again. */ - isccc_ccmsg_invalidate(&conn->ccmsg); + isccc_ccmsg_disconnect(&conn->ccmsg); /* Detach the reading reference */ controlconnection_detach(&conn); @@ -575,6 +575,8 @@ conn_free(controlconnection_t *conn) { controllistener_t *listener = conn->listener; + isccc_ccmsg_invalidate(&conn->ccmsg); + conn_cleanup(conn); if (conn->buffer != NULL) { diff --git a/bin/rndc/rndc.c b/bin/rndc/rndc.c index e129fe8434..645cef5ed0 100644 --- a/bin/rndc/rndc.c +++ b/bin/rndc/rndc.c @@ -348,7 +348,7 @@ rndc_recvdone(isc_nmhandle_t *handle, isc_result_t result, void *arg) { isccc_sexpr_free(&response); - isccc_ccmsg_invalidate(ccmsg); + isccc_ccmsg_disconnect(ccmsg); isc_loopmgr_shutdown(loopmgr); } @@ -1003,6 +1003,8 @@ main(int argc, char **argv) { isc_loopmgr_run(loopmgr); + isccc_ccmsg_invalidate(&rndc_ccmsg); + isc_log_destroy(&log); isc_log_setcontext(NULL); diff --git a/lib/isccc/ccmsg.c b/lib/isccc/ccmsg.c index f52b039152..80d622da79 100644 --- a/lib/isccc/ccmsg.c +++ b/lib/isccc/ccmsg.c @@ -179,6 +179,16 @@ isccc_ccmsg_sendmessage(isccc_ccmsg_t *ccmsg, isc_region_t *region, isc_nm_send(ccmsg->handle, region, ccmsg_senddone, ccmsg); } +void +isccc_ccmsg_disconnect(isccc_ccmsg_t *ccmsg) { + REQUIRE(VALID_CCMSG(ccmsg)); + + if (ccmsg->handle != NULL) { + isc_nmhandle_close(ccmsg->handle); + isc_nmhandle_detach(&ccmsg->handle); + } +} + void isccc_ccmsg_invalidate(isccc_ccmsg_t *ccmsg) { REQUIRE(VALID_CCMSG(ccmsg)); @@ -188,10 +198,6 @@ isccc_ccmsg_invalidate(isccc_ccmsg_t *ccmsg) { if (ccmsg->buffer != NULL) { isc_buffer_free(&ccmsg->buffer); } - if (ccmsg->handle != NULL) { - isc_nmhandle_close(ccmsg->handle); - isc_nmhandle_detach(&ccmsg->handle); - } } void diff --git a/lib/isccc/include/isccc/ccmsg.h b/lib/isccc/include/isccc/ccmsg.h index 8404252a56..7a20a7c2e1 100644 --- a/lib/isccc/include/isccc/ccmsg.h +++ b/lib/isccc/include/isccc/ccmsg.h @@ -120,18 +120,25 @@ isccc_ccmsg_sendmessage(isccc_ccmsg_t *ccmsg, isc_region_t *region, */ void -isccc_ccmsg_invalidate(isccc_ccmsg_t *ccmsg); +isccc_ccmsg_disconnect(isccc_ccmsg_t *ccmsg); /*% - * Clean up all allocated state, and invalidate the structure. + * Disconnect from the connected netmgr handle associated with a command + * channel message. * * Requires: * - *\li "ccmsg" be valid. + *\li "ccmsg" to be valid. + */ + +void +isccc_ccmsg_invalidate(isccc_ccmsg_t *ccmsg); +/*% + * Clean up the magic number and the dynamic buffer associated with a command + * channel message. * - * Ensures: + * Requires: * - *\li "ccmsg" is invalidated and disassociated with all memory contexts, - * sockets, etc. + *\li "ccmsg" to be valid. */ void