+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
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.
*
#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.
ns_server_scan_interfaces(ns_server_t *server);
/*%<
* Trigger a interface scan.
+ * Must only be called when running under server->task.
*/
void
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:
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;
}
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;
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
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);
/*
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,
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 *