diff --git a/CHANGES b/CHANGES index d5d3e6a628..0a8a788169 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +6179. [bug] Fix an interfacemgr use-after-free error in + zoneconf.c:isself(). [GL #3765] + 6176. [test] Add support for using pytest & pytest-xdist to execute the system test suite. [GL #3978] diff --git a/bin/named/zoneconf.c b/bin/named/zoneconf.c index 8b731adbb2..e4d73ebcd9 100644 --- a/bin/named/zoneconf.c +++ b/bin/named/zoneconf.c @@ -777,23 +777,27 @@ checknames(dns_zonetype_t ztype, const cfg_obj_t **maps, static bool isself(dns_view_t *myview, dns_tsigkey_t *mykey, const isc_sockaddr_t *srcaddr, const isc_sockaddr_t *dstaddr, dns_rdataclass_t rdclass, void *arg) { - ns_interfacemgr_t *interfacemgr = (ns_interfacemgr_t *)arg; - dns_aclenv_t *env = ns_interfacemgr_getaclenv(interfacemgr); - dns_view_t *view; + dns_aclenv_t *env = NULL; + dns_view_t *view = NULL; dns_tsigkey_t *key = NULL; isc_netaddr_t netsrc; isc_netaddr_t netdst; - if (interfacemgr == NULL) { + UNUSED(arg); + + /* interfacemgr can be destroyed only in exclusive mode. */ + if (named_g_server->interfacemgr == NULL) { return (true); } - if (!ns_interfacemgr_listeningon(interfacemgr, dstaddr)) { + if (!ns_interfacemgr_listeningon(named_g_server->interfacemgr, dstaddr)) + { return (false); } isc_netaddr_fromsockaddr(&netsrc, srcaddr); isc_netaddr_fromsockaddr(&netdst, dstaddr); + env = ns_interfacemgr_getaclenv(named_g_server->interfacemgr); for (view = ISC_LIST_HEAD(named_g_server->viewlist); view != NULL; view = ISC_LIST_NEXT(view, link)) @@ -1315,7 +1319,7 @@ named_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, dns_zone_setoption(zone, DNS_ZONEOPT_NOTIFYTOSOA, cfg_obj_asboolean(obj)); - dns_zone_setisself(zone, isself, named_g_server->interfacemgr); + dns_zone_setisself(zone, isself, NULL); CHECK(configure_zone_acl( zconfig, vconfig, config, allow_transfer, ac, zone,