diff --git a/userspace/libsinsp/dns_manager.cpp b/userspace/libsinsp/dns_manager.cpp index 96aaebc7cc..b53e1f6b5a 100644 --- a/userspace/libsinsp/dns_manager.cpp +++ b/userspace/libsinsp/dns_manager.cpp @@ -118,7 +118,7 @@ bool sinsp_dns_manager::match(const char *name, int af, void *addr, uint64_t ts) #if defined(HAS_CAPTURE) && !defined(CYGWING_AGENT) && !defined(_WIN32) && !defined(__EMSCRIPTEN__) if(!m_resolver) { - m_resolver = new std::thread(sinsp_dns_resolver::refresh, m_erase_timeout, m_base_refresh_timeout, m_max_refresh_timeout, m_exit_signal.get_future()); + m_resolver = std::make_unique(sinsp_dns_resolver::refresh, m_erase_timeout, m_base_refresh_timeout, m_max_refresh_timeout, m_exit_signal.get_future()); } std::string sname = std::string(name); @@ -195,7 +195,7 @@ void sinsp_dns_manager::cleanup() { m_exit_signal.set_value(); m_resolver->join(); - m_resolver = NULL; + m_resolver.reset(); m_exit_signal = std::promise(); } } diff --git a/userspace/libsinsp/dns_manager.h b/userspace/libsinsp/dns_manager.h index 4e3bf75fd5..dd4eecf7d9 100644 --- a/userspace/libsinsp/dns_manager.h +++ b/userspace/libsinsp/dns_manager.h @@ -124,7 +124,7 @@ class sinsp_dns_manager // used to let m_resolver know when to terminate std::promise m_exit_signal; - std::thread *m_resolver; + std::unique_ptr m_resolver; uint64_t m_erase_timeout; uint64_t m_base_refresh_timeout; diff --git a/userspace/libsinsp/test/CMakeLists.txt b/userspace/libsinsp/test/CMakeLists.txt index 058e59b200..8668569641 100644 --- a/userspace/libsinsp/test/CMakeLists.txt +++ b/userspace/libsinsp/test/CMakeLists.txt @@ -110,6 +110,7 @@ set(LIBSINSP_UNIT_TESTS_SOURCES container_info.ut.cpp sinsp_utils.ut.cpp state.ut.cpp + dns_manager.ut.cpp eventformatter.ut.cpp savefile.ut.cpp sinsp_stats.ut.cpp @@ -178,6 +179,7 @@ endif() target_link_libraries(unit-test-libsinsp "${GTEST_LIB}" "${GTEST_MAIN_LIB}" + "${TBB_LIB}" sinsp ) diff --git a/userspace/libsinsp/test/dns_manager.ut.cpp b/userspace/libsinsp/test/dns_manager.ut.cpp new file mode 100644 index 0000000000..664657a0fd --- /dev/null +++ b/userspace/libsinsp/test/dns_manager.ut.cpp @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: Apache-2.0 +/* +Copyright (C) 2023 The Falco Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +*/ + +#if defined(HAS_CAPTURE) && !defined(CYGWING_AGENT) && !defined(_WIN32) && !defined(__EMSCRIPTEN__) +#include +#include + +TEST(sinsp_dns_manager, simple_dns_manager_invocation) +{ + // Simple dummy test to assert that sinsp_dns_manager is invocated correctly + // and not leaking memory + const char* name = "bogus"; + uint64_t ts = 11111111111111; + uint32_t addr = 111111; + bool result = sinsp_dns_manager::get().match(name, AF_INET, &addr, ts); + ASSERT_FALSE(result); +} +#endif