mirror of
https://github.com/isc-projects/bind9.git
synced 2026-06-11 08:09:59 -04:00
Merge branch '3272-shutdown-deadlock-v9_18' into 'v9_18'
prevent a deadlock in the shutdown system test See merge request isc-projects/bind9!6207
This commit is contained in:
commit
44a935cbdc
2 changed files with 23 additions and 15 deletions
4
CHANGES
4
CHANGES
|
|
@ -1,3 +1,7 @@
|
|||
5875. [bug] Fixed a deadlock that could occur if an rndc
|
||||
connection arrived during the shutdown of network
|
||||
interfaces. [GL #3272]
|
||||
|
||||
5873. [bug] Refactor the fctx_done() function to set fctx to
|
||||
NULL after detaching, so that reference counting
|
||||
errors will be easier to avoid. [GL #2969]
|
||||
|
|
|
|||
|
|
@ -740,10 +740,6 @@ interface_destroy(ns_interface_t **interfacep) {
|
|||
|
||||
ns_interface_shutdown(ifp);
|
||||
|
||||
if (ISC_LINK_LINKED(ifp, link)) {
|
||||
ISC_LIST_UNLINK(mgr->interfaces, ifp, link);
|
||||
}
|
||||
|
||||
ifp->magic = 0;
|
||||
isc_mutex_destroy(&ifp->lock);
|
||||
ns_interfacemgr_detach(&ifp->mgr);
|
||||
|
|
@ -777,26 +773,34 @@ find_matching_interface(ns_interfacemgr_t *mgr, isc_sockaddr_t *addr) {
|
|||
*/
|
||||
static void
|
||||
purge_old_interfaces(ns_interfacemgr_t *mgr) {
|
||||
ns_interface_t *ifp, *next;
|
||||
ns_interface_t *ifp = NULL, *next = NULL;
|
||||
ISC_LIST(ns_interface_t) interfaces;
|
||||
|
||||
ISC_LIST_INIT(interfaces);
|
||||
|
||||
LOCK(&mgr->lock);
|
||||
for (ifp = ISC_LIST_HEAD(mgr->interfaces); ifp != NULL; ifp = next) {
|
||||
INSIST(NS_INTERFACE_VALID(ifp));
|
||||
next = ISC_LIST_NEXT(ifp, link);
|
||||
if (ifp->generation != mgr->generation) {
|
||||
ISC_LIST_UNLINK(ifp->mgr->interfaces, ifp, link);
|
||||
if (LISTENING(ifp)) {
|
||||
char sabuf[256];
|
||||
isc_sockaddr_format(&ifp->addr, sabuf,
|
||||
sizeof(sabuf));
|
||||
isc_log_write(
|
||||
IFMGR_COMMON_LOGARGS, ISC_LOG_INFO,
|
||||
"no longer listening on %s", sabuf);
|
||||
ns_interface_shutdown(ifp);
|
||||
}
|
||||
interface_destroy(&ifp);
|
||||
ISC_LIST_APPEND(interfaces, ifp, link);
|
||||
}
|
||||
}
|
||||
UNLOCK(&mgr->lock);
|
||||
|
||||
for (ifp = ISC_LIST_HEAD(interfaces); ifp != NULL; ifp = next) {
|
||||
next = ISC_LIST_NEXT(ifp, link);
|
||||
if (LISTENING(ifp)) {
|
||||
char sabuf[256];
|
||||
isc_sockaddr_format(&ifp->addr, sabuf, sizeof(sabuf));
|
||||
isc_log_write(IFMGR_COMMON_LOGARGS, ISC_LOG_INFO,
|
||||
"no longer listening on %s", sabuf);
|
||||
ns_interface_shutdown(ifp);
|
||||
}
|
||||
ISC_LIST_UNLINK(interfaces, ifp, link);
|
||||
interface_destroy(&ifp);
|
||||
}
|
||||
}
|
||||
|
||||
static bool
|
||||
|
|
|
|||
Loading…
Reference in a new issue