]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
3915 [bug] Address a assertion if a route event arrived while
authorMark Andrews <marka@isc.org>
Mon, 18 Aug 2014 03:16:28 +0000 (13:16 +1000)
committerMark Andrews <marka@isc.org>
Mon, 18 Aug 2014 03:16:28 +0000 (13:16 +1000)
                        shutting down. [RT #36887]

CHANGES
bin/named/include/named/interfacemgr.h
bin/named/include/named/server.h
bin/named/interfacemgr.c
bin/named/server.c

diff --git a/CHANGES b/CHANGES
index fedbb6bfd0ce3cb2833e5062b349fe970b6c7487..060ce71034762f8d0eb40695925967d51398c762 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+3915   [bug]           Address a assertion if a route event arrived while
+                       shutting down. [RT #36887]
+
        --- 9.10.1b2 released ---
 
 3914.  [bug]           Allow the URI target and CAA value fields to
index dbb4a8964530ccebcb93d5df88b78b2f2948e8c0..9645a354cfe9a29bc9a3d916ef6d7840342f56c8 100644 (file)
@@ -97,7 +97,7 @@ isc_result_t
 ns_interfacemgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
                       isc_socketmgr_t *socketmgr,
                       dns_dispatchmgr_t *dispatchmgr,
-                      ns_interfacemgr_t **mgrp);
+                      isc_task_t *task, ns_interfacemgr_t **mgrp);
 /*%
  * Create a new interface manager.
  *
index d215c1dd71bd04350ee961ef40db16e0e781cbf2..376810f574253f6e33e9939aaf8b55d0c29d434c 100644 (file)
@@ -37,7 +37,6 @@
 #define NS_EVENTCLASS          ISC_EVENTCLASS(0x4E43)
 #define NS_EVENT_RELOAD                (NS_EVENTCLASS + 0)
 #define NS_EVENT_CLIENTCONTROL (NS_EVENTCLASS + 1)
-#define NS_EVENT_IFSCAN                (NS_EVENTCLASS + 2)
 
 /*%
  * Name server state.  Better here than in lots of separate global variables.
@@ -225,6 +224,7 @@ void
 ns_server_scan_interfaces(ns_server_t *server);
 /*%<
  * Trigger a interface scan.
+ * Must only be called when running under server->task.
  */
 
 void
index 342408876f99ec7e85a7fe8675a9b45d41d1459b..a0c0eda085073731cfc5ad4170fdbb1d2f5c2c5a 100644 (file)
@@ -140,7 +140,7 @@ route_event(isc_task_t *task, isc_event_t *event) {
        switch (rtm->MSGTYPE) {
        case RTM_NEWADDR:
        case RTM_DELADDR:
-               if (ns_g_server->interface_auto)
+               if (mgr->route != NULL && ns_g_server->interface_auto)
                        ns_server_scan_interfaces(ns_g_server);
                break;
        default:
@@ -172,7 +172,7 @@ isc_result_t
 ns_interfacemgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
                       isc_socketmgr_t *socketmgr,
                       dns_dispatchmgr_t *dispatchmgr,
-                      ns_interfacemgr_t **mgrp)
+                      isc_task_t *task, ns_interfacemgr_t **mgrp)
 {
        isc_result_t result;
        ns_interfacemgr_t *mgr;
@@ -232,11 +232,8 @@ ns_interfacemgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
        }
 
        mgr->task = NULL;
-       if (mgr->route != NULL) {
-               result = isc_task_create(taskmgr, 0, &mgr->task);
-               if (result != ISC_R_SUCCESS)
-                       goto cleanup_route;
-       }
+       if (mgr->route != NULL)
+               isc_task_attach(task, &mgr->task);
        mgr->references = (mgr->route != NULL) ? 2 : 1;
 #else
        mgr->references = 1;
@@ -260,9 +257,6 @@ ns_interfacemgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
        return (ISC_R_SUCCESS);
 
 #ifdef USE_ROUTE_SOCKET
- cleanup_route:
-       if (mgr->route != NULL)
-               isc_socket_detach(&mgr->route);
  cleanup_aclenv:
        dns_aclenv_destroy(&mgr->aclenv);
 #endif
index d37a3ce42ed3322e26c3f669879054fbcd0fc14e..3d72e075adfb78641e936a01676a9a02abdaf49f 100644 (file)
@@ -4818,11 +4818,6 @@ interface_timer_tick(isc_task_t *task, isc_event_t *event) {
        INSIST(task == server->task);
        UNUSED(task);
 
-       if (event->ev_type == NS_EVENT_IFSCAN)
-               isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
-                             NS_LOGMODULE_SERVER, ISC_LOG_DEBUG(1),
-                             "automatic interface rescan");
-
        isc_event_free(&event);
 
        /*
@@ -6487,7 +6482,7 @@ run_server(isc_task_t *task, isc_event_t *event) {
 
        CHECKFATAL(ns_interfacemgr_create(ns_g_mctx, ns_g_taskmgr,
                                          ns_g_socketmgr, ns_g_dispatchmgr,
-                                         &server->interfacemgr),
+                                         server->task, &server->interfacemgr),
                   "creating interface manager");
 
        CHECKFATAL(isc_timer_create(ns_g_timermgr, isc_timertype_inactive,
@@ -7034,13 +7029,16 @@ ns_server_reloadwanted(ns_server_t *server) {
 
 void
 ns_server_scan_interfaces(ns_server_t *server) {
-       isc_event_t *event;
+       isc_result_t result;
 
-       event = isc_event_allocate(ns_g_mctx, server, NS_EVENT_IFSCAN,
-                                  interface_timer_tick, server,
-                                  sizeof(isc_event_t));
-       if (event != NULL)
-               isc_task_send(server->task, &event);
+       isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+                     NS_LOGMODULE_SERVER, ISC_LOG_DEBUG(1),
+                     "automatic interface rescan");
+
+       result = isc_task_beginexclusive(server->task);
+       RUNTIME_CHECK(result == ISC_R_SUCCESS);
+       scan_interfaces(server, ISC_TRUE);
+       isc_task_endexclusive(server->task);
 }
 
 static char *