Fix DNSLookup memory leak (#422)

* Fix memory leak with shared_ptr and -fsanitize=address

* Replace addrinfo* by shared_ptr

* fsanitize=address only on Linux

* Add USE_WS Linux CI test

* Remove fsanitize from the cmake files

* Remove USE_WS in linux test suite
This commit is contained in:
itytophile
2022-12-23 02:13:51 +01:00
committed by GitHub
parent a5d4911a16
commit 679ce519dd
5 changed files with 24 additions and 35 deletions

View File

@ -23,6 +23,7 @@
#include <chrono>
#include <string.h>
#include <thread>
#include <utility>
// mingw build quirks
#if defined(_WIN32) && defined(__GNUC__)
@ -44,7 +45,7 @@ namespace ix
;
}
struct addrinfo* DNSLookup::getAddrInfo(const std::string& hostname,
DNSLookup::AddrInfoPtr DNSLookup::getAddrInfo(const std::string& hostname,
int port,
std::string& errMsg)
{
@ -63,10 +64,10 @@ namespace ix
errMsg = gai_strerror(getaddrinfo_result);
res = nullptr;
}
return res;
return AddrInfoPtr{ res, freeaddrinfo };
}
struct addrinfo* DNSLookup::resolve(std::string& errMsg,
DNSLookup::AddrInfoPtr DNSLookup::resolve(std::string& errMsg,
const CancellationRequest& isCancellationRequested,
bool cancellable)
{
@ -74,12 +75,7 @@ namespace ix
: resolveUnCancellable(errMsg, isCancellationRequested);
}
void DNSLookup::release(struct addrinfo* addr)
{
freeaddrinfo(addr);
}
struct addrinfo* DNSLookup::resolveUnCancellable(
DNSLookup::AddrInfoPtr DNSLookup::resolveUnCancellable(
std::string& errMsg, const CancellationRequest& isCancellationRequested)
{
errMsg = "no error";
@ -94,7 +90,7 @@ namespace ix
return getAddrInfo(_hostname, _port, errMsg);
}
struct addrinfo* DNSLookup::resolveCancellable(
DNSLookup::AddrInfoPtr DNSLookup::resolveCancellable(
std::string& errMsg, const CancellationRequest& isCancellationRequested)
{
errMsg = "no error";
@ -157,7 +153,7 @@ namespace ix
// gone, so we use temporary variables (res) or we pass in by copy everything that
// getAddrInfo needs to work.
std::string errMsg;
struct addrinfo* res = getAddrInfo(hostname, port, errMsg);
auto res = getAddrInfo(hostname, port, errMsg);
if (auto lock = self.lock())
{
@ -181,13 +177,13 @@ namespace ix
return _errMsg;
}
void DNSLookup::setRes(struct addrinfo* addr)
void DNSLookup::setRes(DNSLookup::AddrInfoPtr addr)
{
std::lock_guard<std::mutex> lock(_resMutex);
_res = addr;
_res = std::move(addr);
}
struct addrinfo* DNSLookup::getRes()
DNSLookup::AddrInfoPtr DNSLookup::getRes()
{
std::lock_guard<std::mutex> lock(_resMutex);
return _res;