From: Witold Kręcicki Date: Sat, 7 Dec 2019 22:44:16 +0000 (+0100) Subject: always return true in ns_interfacemgr_listeningon if interfacemgr is shutting down X-Git-Tag: v9.15.7~20^2~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b804d3a395fd0038670f51df6269efcbeb67088a;p=thirdparty%2Fbind9.git always return true in ns_interfacemgr_listeningon if interfacemgr is shutting down to avoid deadlocks on shutdown. --- diff --git a/lib/ns/interfacemgr.c b/lib/ns/interfacemgr.c index 2dd03a0eee9..3bbeee2a50b 100644 --- a/lib/ns/interfacemgr.c +++ b/lib/ns/interfacemgr.c @@ -83,6 +83,7 @@ struct ns_interfacemgr { ISC_LIST(isc_sockaddr_t) listenon; int backlog; /*%< Listen queue size */ unsigned int udpdisp; /*%< UDP dispatch count */ + atomic_bool shuttingdown; /*%< Interfacemgr is shutting down */ #ifdef USE_ROUTE_SOCKET isc_task_t * task; isc_socket_t * route; @@ -217,6 +218,7 @@ ns_interfacemgr_create(isc_mem_t *mctx, mgr->listenon4 = NULL; mgr->listenon6 = NULL; mgr->udpdisp = udpdisp; + atomic_init(&mgr->shuttingdown, false); ISC_LIST_INIT(mgr->interfaces); ISC_LIST_INIT(mgr->listenon); @@ -360,6 +362,7 @@ ns_interfacemgr_shutdown(ns_interfacemgr_t *mgr) { * consider all interfaces "old". */ mgr->generation++; + atomic_store(&mgr->shuttingdown, true); #ifdef USE_ROUTE_SOCKET LOCK(&mgr->lock); if (mgr->route != NULL) { @@ -1230,7 +1233,13 @@ ns_interfacemgr_listeningon(ns_interfacemgr_t *mgr, bool result = false; REQUIRE(NS_INTERFACEMGR_VALID(mgr)); - + /* + * If the manager is shutting down it's safer to + * return true. + */ + if (atomic_load(&mgr->shuttingdown)) { + return (true); + } LOCK(&mgr->lock); for (old = ISC_LIST_HEAD(mgr->listenon); old != NULL;