From 75427139ad4ecd283a8841e0b9cbba99fa1fb6c2 Mon Sep 17 00:00:00 2001 From: Evan Hunt Date: Sun, 17 Oct 2021 16:45:22 -0700 Subject: [PATCH 1/2] attach the interface manager when activating a route socket it was possible for the route socket's udp_recv() callback to fire after the interfacemgr was detached, causing an assertion failure. this has now been fixed by referencing the interfacemgr when setting up the route socket, and dereferencing it when shutting it down. --- lib/ns/interfacemgr.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/lib/ns/interfacemgr.c b/lib/ns/interfacemgr.c index 316d0142f4..1bca46768a 100644 --- a/lib/ns/interfacemgr.c +++ b/lib/ns/interfacemgr.c @@ -116,6 +116,14 @@ route_recv(isc_nmhandle_t *handle, isc_result_t eresult, isc_region_t *region, return; } + if (eresult == ISC_R_SHUTTINGDOWN) { + /* + * The mgr->route and mgr is detached in + * ns_interfacemgr_shutdown() + */ + return; + } + if (eresult != ISC_R_SUCCESS) { if (eresult != ISC_R_CANCELED) { isc_log_write(IFMGR_COMMON_LOGARGS, ISC_LOG_ERROR, @@ -124,6 +132,7 @@ route_recv(isc_nmhandle_t *handle, isc_result_t eresult, isc_region_t *region, isc_result_totext(eresult)); } isc_nmhandle_detach(&mgr->route); + ns_interfacemgr_detach(&mgr); return; } @@ -136,6 +145,7 @@ route_recv(isc_nmhandle_t *handle, isc_result_t eresult, isc_region_t *region, "recompile required", rtm->rtm_version, RTM_VERSION); isc_nmhandle_detach(&mgr->route); + ns_interfacemgr_detach(&mgr); return; } #endif /* ifdef RTM_VERSION */ @@ -164,6 +174,7 @@ route_recv(isc_nmhandle_t *handle, isc_result_t eresult, isc_region_t *region, if (done) { isc_nmhandle_detach(&mgr->route); + ns_interfacemgr_detach(&mgr); } return; } @@ -181,6 +192,7 @@ route_connected(isc_nmhandle_t *handle, isc_result_t eresult, void *arg) { INSIST(mgr->route == NULL); + ns_interfacemgr_attach(mgr, &(ns_interfacemgr_t *){ NULL }); isc_nmhandle_attach(handle, &mgr->route); isc_nm_read(handle, route_recv, mgr); } @@ -283,9 +295,6 @@ ns_interfacemgr_destroy(ns_interfacemgr_t *mgr) { isc_refcount_destroy(&mgr->references); - if (mgr->route != NULL) { - isc_nmhandle_detach(&mgr->route); - } dns_aclenv_detach(&mgr->aclenv); ns_listenlist_detach(&mgr->listenon4); ns_listenlist_detach(&mgr->listenon6); @@ -346,19 +355,18 @@ ns_interfacemgr_shutdown(ns_interfacemgr_t *mgr) { /*% * Shut down and detach all interfaces. - * By incrementing the generation count, we make purge_old_interfaces() - * consider all interfaces "old". + * By incrementing the generation count, we make + * purge_old_interfaces() consider all interfaces "old". */ mgr->generation++; atomic_store(&mgr->shuttingdown, true); - LOCK(&mgr->lock); + purge_old_interfaces(mgr); + if (mgr->route != NULL) { isc_nmhandle_detach(&mgr->route); + ns_interfacemgr_detach(&mgr); } - UNLOCK(&mgr->lock); - - purge_old_interfaces(mgr); } static isc_result_t From 32b50407bf0af3e4e5a6d97ce3109c79c22933db Mon Sep 17 00:00:00 2001 From: Evan Hunt Date: Sun, 17 Oct 2021 13:30:47 -0700 Subject: [PATCH 2/2] check statichandle before attaching it is possible for udp_recv_cb() to fire after the socket is already shutting down and statichandle is NULL; we need to create a temporary handle in this case. --- lib/isc/netmgr/netmgr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/isc/netmgr/netmgr.c b/lib/isc/netmgr/netmgr.c index 9b884e0a93..10b0d23457 100644 --- a/lib/isc/netmgr/netmgr.c +++ b/lib/isc/netmgr/netmgr.c @@ -2144,7 +2144,7 @@ isc__nm_get_read_req(isc_nmsocket_t *sock, isc_sockaddr_t *sockaddr) { isc_nmhandle_attach(sock->statichandle, &req->handle); break; default: - if (atomic_load(&sock->client)) { + if (atomic_load(&sock->client) && sock->statichandle != NULL) { isc_nmhandle_attach(sock->statichandle, &req->handle); } else { req->handle = isc__nmhandle_get(sock, sockaddr, NULL);