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.
&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
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);
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");
}
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);
+ }
}
/*