]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
[v9_12] Prevent crashing due to a race during server shutdown
authorMichał Kępień <michal@isc.org>
Mon, 5 Feb 2018 19:24:14 +0000 (20:24 +0100)
committerMichał Kępień <michal@isc.org>
Mon, 5 Feb 2018 19:25:41 +0000 (20:25 +0100)
4884. [bug] named could crash on shutdown due to a race between
shutdown_server() and ns__client_request(). [RT #47120]

(cherry picked from commit af1937c35ae1414903d76909ac3d7dc9f4f147a2)

CHANGES
bin/named/server.c
lib/ns/client.c
lib/ns/include/ns/server.h
lib/ns/tests/nstest.c

diff --git a/CHANGES b/CHANGES
index b82bcd1f3d2bd7746d94fbafa5ce55dd17adc553..737bff38edeba0ef9258a599438976c96091db6c 100644 (file)
--- 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
index 81f8f08b36a014577f06a7c147beb4bab4d433b6..99d4432ca0d7fcfe31935ff3961da0e4ce62d91c 100644 (file)
@@ -9345,11 +9345,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);
index 6603ba13ed0f024f0a0dfab8ad25413ee375ee9e..1d3b62a5ebba32f92e0349448f00f784a34d86eb 100644 (file)
@@ -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];
index 9e6c73edd89765ed56c4136474648f51215ed112..ea9df4b7fef288e7b2a8e087e111a81f89855906 100644 (file)
@@ -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);
 
 /*%
index e9f4c36274733520259550fb47f50342ae18e1d6..bc3ea5856f4f5768c45ecebf2716abc0b322957f 100644 (file)
@@ -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);