From a8807d9a7b25e14185d181abe1de12bf5d5a7af4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Witold=20Kr=C4=99cicki?= Date: Thu, 28 May 2020 12:34:37 +0200 Subject: [PATCH 1/3] Add missing isc_mutex_destroy and isc_conditional_destroy calls. While harmless on Linux, missing isc_{mutex,conditional}_destroy causes a memory leak on *BSD. Missing calls were added. --- bin/named/server.c | 1 + lib/isc/netmgr/netmgr.c | 5 +++++ lib/isc/task.c | 3 +++ 3 files changed, 9 insertions(+) diff --git a/bin/named/server.c b/bin/named/server.c index 5cb08d2e46..892b497a0d 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -10086,6 +10086,7 @@ named_server_destroy(named_server_t **serverp) { dst_lib_destroy(); isc_event_free(&server->reload_event); + isc_mutex_destroy(&server->reload_event_lock); INSIST(ISC_LIST_EMPTY(server->kasplist)); INSIST(ISC_LIST_EMPTY(server->viewlist)); diff --git a/lib/isc/netmgr/netmgr.c b/lib/isc/netmgr/netmgr.c index 3f7723a1b4..a004d55804 100644 --- a/lib/isc/netmgr/netmgr.c +++ b/lib/isc/netmgr/netmgr.c @@ -276,6 +276,9 @@ nm_destroy(isc_nm_t **mgr0) { isc_queue_destroy(worker->ievents); isc_queue_destroy(worker->ievents_prio); + isc_mutex_destroy(&worker->lock); + isc_condition_destroy(&worker->cond); + isc_mem_put(mgr->mctx, worker->recvbuf, ISC_NETMGR_RECVBUF_SIZE); isc_thread_join(worker->thread, NULL); @@ -771,6 +774,8 @@ nmsocket_cleanup(isc_nmsocket_t *sock, bool dofree) { isc_mem_free(sock->mgr->mctx, sock->ah_frees); isc_mem_free(sock->mgr->mctx, sock->ah_handles); + isc_mutex_destroy(&sock->lock); + isc_condition_destroy(&sock->cond); if (dofree) { isc_nm_t *mgr = sock->mgr; diff --git a/lib/isc/task.c b/lib/isc/task.c index 5d9cef42ec..c0a5179375 100644 --- a/lib/isc/task.c +++ b/lib/isc/task.c @@ -1356,9 +1356,12 @@ static void manager_free(isc__taskmgr_t *manager) { for (unsigned int i = 0; i < manager->workers; i++) { isc_mutex_destroy(&manager->queues[i].lock); + isc_condition_destroy(&manager->queues[i].work_available); } isc_mutex_destroy(&manager->lock); + isc_mutex_destroy(&manager->excl_lock); isc_mutex_destroy(&manager->halt_lock); + isc_condition_destroy(&manager->halt_cond); isc_mem_put(manager->mctx, manager->queues, manager->workers * sizeof(isc__taskqueue_t)); manager->common.impmagic = 0; From 7ef756f63989c13dbe951b45cf94610014c2b6d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Witold=20Kr=C4=99cicki?= Date: Thu, 28 May 2020 14:47:04 +0200 Subject: [PATCH 2/3] Clear sock->magic to 0 when destroying a netmgr socket --- lib/isc/netmgr/netmgr.c | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/isc/netmgr/netmgr.c b/lib/isc/netmgr/netmgr.c index a004d55804..9e4b692f80 100644 --- a/lib/isc/netmgr/netmgr.c +++ b/lib/isc/netmgr/netmgr.c @@ -771,6 +771,7 @@ nmsocket_cleanup(isc_nmsocket_t *sock, bool dofree) { } isc_astack_destroy(sock->inactivereqs); + sock->magic = 0; isc_mem_free(sock->mgr->mctx, sock->ah_frees); isc_mem_free(sock->mgr->mctx, sock->ah_handles); From 4ae2a748735b094be074f718a33ded4cc1a1a528 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Witold=20Kr=C4=99cicki?= Date: Thu, 28 May 2020 12:38:29 +0200 Subject: [PATCH 3/3] CHANGES and release notes --- CHANGES | 3 +++ doc/notes/notes-current.rst | 3 +++ 2 files changed, 6 insertions(+) diff --git a/CHANGES b/CHANGES index eef4ebcfd8..8cfb61e34b 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +5420. [bug] Add missing isc_{mutex,conditional}_destroy calls + that caused a memory leak on FreeBSD. [GL #1893] + 5419. [func] "dig +qid=" sets the query ID to an arbitrary value. "configure --enable-singletrace" allows trace logging of a single query when QID is set to 0. diff --git a/doc/notes/notes-current.rst b/doc/notes/notes-current.rst index 46d61fd32d..8289252f15 100644 --- a/doc/notes/notes-current.rst +++ b/doc/notes/notes-current.rst @@ -121,3 +121,6 @@ Bug Fixes - When built without LMDB support, ``named`` failed to restart after a zone with a double quote (") in its name was added with ``rndc addzone``. Thanks to Alberto Fernández. [GL #1695] + +- Missing mutex and conditional destruction in netmgr code leads to a + memory leak on *BSD systems. [GL #1893]