From: Michał Kępień Date: Mon, 5 Feb 2018 19:24:14 +0000 (+0100) Subject: [master] Prevent crashing due to a race during server shutdown X-Git-Tag: v9.13.0~190 X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=af1937c35ae1414903d76909ac3d7dc9f4f147a2;p=thirdparty%2Fbind9.git [master] Prevent crashing due to a race during server shutdown 4884. [bug] named could crash on shutdown due to a race between shutdown_server() and ns__client_request(). [RT #47120] --- diff --git a/CHANGES b/CHANGES index a9603a92a44..0aaa1a0f5a2 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +4884. [bug] named could crash on shutdown due to a race between + shutdown_server() and ns__client_request(). [RT #47120] + 4883. [cleanup] Improved debugging output from dnssec-cds. [RT #47026] 4882. [bug] Address potential memory leak in diff --git a/bin/named/server.c b/bin/named/server.c index cdae4d34710..04cbb0f947f 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -9347,11 +9347,9 @@ shutdown_server(isc_task_t *task, isc_event_t *event) { */ static isc_result_t get_matching_view(isc_netaddr_t *srcaddr, isc_netaddr_t *destaddr, - dns_message_t *message, dns_ecs_t *ecs, + dns_message_t *message, dns_aclenv_t *env, dns_ecs_t *ecs, isc_result_t *sigresult, dns_view_t **viewp) { - dns_aclenv_t *env = - ns_interfacemgr_getaclenv(named_g_server->interfacemgr); dns_view_t *view; REQUIRE(message != NULL); diff --git a/lib/ns/client.c b/lib/ns/client.c index 6603ba13ed0..1d3b62a5ebb 100644 --- a/lib/ns/client.c +++ b/lib/ns/client.c @@ -2262,6 +2262,7 @@ ns__client_request(isc_task_t *task, isc_event_t *event) { unsigned int flags; isc_boolean_t notimp; size_t reqsize; + dns_aclenv_t *env; dns_ecs_t *ecs = NULL; #ifdef HAVE_DNSTAP dns_dtmsgtype_t dtmsgtype; @@ -2372,9 +2373,8 @@ ns__client_request(isc_task_t *task, isc_event_t *event) { * Check the blackhole ACL for UDP only, since TCP is done in * client_newconn. */ + env = ns_interfacemgr_getaclenv(client->interface->mgr); if (!TCP_CLIENT(client)) { - dns_aclenv_t *env = - ns_interfacemgr_getaclenv(client->interface->mgr); if (client->sctx->blackholeacl != NULL && dns_acl_match(&netaddr, NULL, client->sctx->blackholeacl, env, &match, NULL) == ISC_R_SUCCESS && @@ -2632,7 +2632,7 @@ ns__client_request(isc_task_t *task, isc_event_t *event) { ecs = &client->ecs; } result = client->sctx->matchingview(&netaddr, &client->destaddr, - client->message, ecs, + client->message, env, ecs, &sigresult, &client->view); if (result != ISC_R_SUCCESS) { char classname[DNS_RDATACLASS_FORMATSIZE]; diff --git a/lib/ns/include/ns/server.h b/lib/ns/include/ns/server.h index 9e6c73edd89..ea9df4b7fef 100644 --- a/lib/ns/include/ns/server.h +++ b/lib/ns/include/ns/server.h @@ -56,7 +56,7 @@ typedef void */ typedef isc_result_t (*ns_matchview_t)(isc_netaddr_t *srcaddr, isc_netaddr_t *destaddr, - dns_message_t *message, dns_ecs_t *ecs, + dns_message_t *message, dns_aclenv_t *env, dns_ecs_t *ecs, isc_result_t *sigresultp, dns_view_t **viewp); /*% diff --git a/lib/ns/tests/nstest.c b/lib/ns/tests/nstest.c index e9f4c362747..bc3ea5856f4 100644 --- a/lib/ns/tests/nstest.c +++ b/lib/ns/tests/nstest.c @@ -86,12 +86,13 @@ static isc_logcategory_t categories[] = { static isc_result_t matchview(isc_netaddr_t *srcaddr, isc_netaddr_t *destaddr, - dns_message_t *message, dns_ecs_t *ecs, + dns_message_t *message, dns_aclenv_t *env, dns_ecs_t *ecs, isc_result_t *sigresultp, dns_view_t **viewp) { UNUSED(srcaddr); UNUSED(destaddr); UNUSED(message); + UNUSED(env); UNUSED(ecs); UNUSED(sigresultp); UNUSED(viewp);