From e0f774d6dd7759a38feae55bedd9a6318585cae3 Mon Sep 17 00:00:00 2001 From: SChernykh Date: Sat, 27 Mar 2021 21:53:40 +0100 Subject: [PATCH] Fixed use-after-free bug when exiting --- src/base/net/dns/DnsUvBackend.cpp | 14 +++++++++----- src/base/net/dns/DnsUvBackend.h | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/base/net/dns/DnsUvBackend.cpp b/src/base/net/dns/DnsUvBackend.cpp index 51ee2193..cb1c0c3e 100644 --- a/src/base/net/dns/DnsUvBackend.cpp +++ b/src/base/net/dns/DnsUvBackend.cpp @@ -29,7 +29,11 @@ namespace xmrig { -Storage DnsUvBackend::m_storage; +Storage& DnsUvBackend::getStorage() +{ + static Storage* storage = new Storage(); + return *storage; +} static addrinfo hints{}; @@ -45,13 +49,13 @@ xmrig::DnsUvBackend::DnsUvBackend() hints.ai_protocol = IPPROTO_TCP; } - m_key = m_storage.add(this); + m_key = getStorage().add(this); } xmrig::DnsUvBackend::~DnsUvBackend() { - m_storage.release(m_key); + getStorage().release(m_key); } @@ -76,7 +80,7 @@ std::shared_ptr xmrig::DnsUvBackend::resolve(const String &ho bool xmrig::DnsUvBackend::resolve(const String &host) { m_req = std::make_shared(); - m_req->data = m_storage.ptr(m_key); + m_req->data = getStorage().ptr(m_key); m_status = uv_getaddrinfo(uv_default_loop(), m_req.get(), DnsUvBackend::onResolved, host.data(), nullptr, &hints); @@ -121,7 +125,7 @@ void xmrig::DnsUvBackend::onResolved(int status, addrinfo *res) void xmrig::DnsUvBackend::onResolved(uv_getaddrinfo_t *req, int status, addrinfo *res) { - auto backend = m_storage.get(req->data); + auto backend = getStorage().get(req->data); if (backend) { backend->onResolved(status, res); } diff --git a/src/base/net/dns/DnsUvBackend.h b/src/base/net/dns/DnsUvBackend.h index f4e6949b..f3733f5a 100644 --- a/src/base/net/dns/DnsUvBackend.h +++ b/src/base/net/dns/DnsUvBackend.h @@ -61,7 +61,7 @@ private: uint64_t m_ts = 0; uintptr_t m_key; - static Storage m_storage; + static Storage& getStorage(); };