]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
address some possible shutdown races in xfrin
authorEvan Hunt <each@isc.org>
Mon, 9 Nov 2020 20:33:37 +0000 (12:33 -0800)
committerEvan Hunt <each@isc.org>
Mon, 9 Nov 2020 20:33:37 +0000 (12:33 -0800)
there were two failures during observed in testing, both occurring
when 'rndc halt' was run rather than 'rndc stop' - the latter dumps
zone contents to disk and presumably introduced enough delay to
prevent the races:

- a failure when the zone was shut down and called dns_xfrin_detach()
  before the xfrin had finished connecting; the connect timeout
  terminated without detaching its handle
- a failure when the tcpdns socket timer fired after the outerhandle
  had already been cleared.

this commit incidentally addresses a failure observed in mutexatomic
due to a variable having been initialized incorrectly.

bin/named/server.c
lib/dns/xfrin.c
lib/isc/netmgr/tcpdns.c

index be731815bac4049bac76adef2d8a94557c86b586..af3ea264420b43588b634ff022331b175c4cd16c 100644 (file)
@@ -10004,7 +10004,7 @@ named_server_create(isc_mem_t *mctx, named_server_t **serverp) {
                                     &server->in_roothints),
                   "setting up root hints");
 
-       atomic_store(&server->reload_status, NAMED_RELOAD_IN_PROGRESS);
+       atomic_init(&server->reload_status, NAMED_RELOAD_IN_PROGRESS);
 
        /*
         * Setup the server task, which is responsible for coordinating
index 497318472ce36cdced56537feeb2e2714ab635fd..71a5eab2efdafa18812a4a546fec1a9844f23f38 100644 (file)
@@ -937,7 +937,7 @@ xfrin_connect_done(isc_nmhandle_t *handle, isc_result_t result, void *cbarg) {
                        TIME_NOW(&now);
                        dns_zonemgr_unreachableadd(zmgr, &xfr->masteraddr,
                                                   &xfr->sourceaddr, &now);
-                       goto failure;
+                       CHECK(result);
                } else {
                        dns_zonemgr_unreachabledel(zmgr, &xfr->masteraddr,
                                                   &xfr->sourceaddr);
@@ -959,9 +959,10 @@ xfrin_connect_done(isc_nmhandle_t *handle, isc_result_t result, void *cbarg) {
                  signer);
 
        CHECK(xfrin_send_request(xfr));
-       isc_nmhandle_detach(&handle);
 
 failure:
+       isc_nmhandle_detach(&handle);
+
        if (result != ISC_R_SUCCESS && result != ISC_R_SHUTTINGDOWN) {
                xfrin_fail(xfr, result, "failed to connect");
        }
index b06d56415da3b5247a97c628db559ccf74d497bb..aa2003ea7956b5e3313b993d060c8e177681720c 100644 (file)
@@ -98,7 +98,9 @@ dnstcp_readtimeout(uv_timer_t *timer) {
        REQUIRE(sock->tid == isc_nm_tid());
 
        /* Close the TCP connection; its closure should fire ours. */
-       isc_nmhandle_detach(&sock->outerhandle);
+       if (sock->outerhandle != NULL) {
+               isc_nmhandle_detach(&sock->outerhandle);
+       }
 }
 
 /*