Fix memory leak in src/socket.cpp

This commit is contained in:
Ben Clayton 2019-11-14 00:37:38 +00:00
parent d13d4a4151
commit 1f7f48904a

View File

@ -74,17 +74,19 @@ class dap::Socket::Shared : public dap::ReaderWriter {
if (info) { if (info) {
auto socket = auto socket =
::socket(info->ai_family, info->ai_socktype, info->ai_protocol); ::socket(info->ai_family, info->ai_socktype, info->ai_protocol);
return std::make_shared<Shared>(*info, socket); return std::make_shared<Shared>(info, socket);
} }
freeaddrinfo(info);
term(); term();
return nullptr; return nullptr;
} }
Shared(SOCKET socket) : info({}), sock(socket) {} Shared(SOCKET socket) : info(nullptr), sock(socket) {}
Shared(const addrinfo& info, SOCKET socket) : info(info), sock(socket) {} Shared(addrinfo* info, SOCKET socket) : info(info), sock(socket) {}
~Shared() { ~Shared() {
freeaddrinfo(info);
close(); close();
term(); term();
} }
@ -141,7 +143,7 @@ class dap::Socket::Shared : public dap::ReaderWriter {
static_cast<int>(bytes), 0) > 0; static_cast<int>(bytes), 0) > 0;
} }
const addrinfo info; addrinfo* const info;
private: private:
std::atomic<SOCKET> sock = {InvalidSocket}; std::atomic<SOCKET> sock = {InvalidSocket};
@ -156,7 +158,7 @@ Socket::Socket(const char* address, const char* port)
} }
auto socket = shared->socket(); auto socket = shared->socket();
if (bind(socket, shared->info.ai_addr, (int)shared->info.ai_addrlen) != 0) { if (bind(socket, shared->info->ai_addr, (int)shared->info->ai_addrlen) != 0) {
shared.reset(); shared.reset();
return; return;
} }
@ -194,8 +196,8 @@ void Socket::close() const {
std::shared_ptr<ReaderWriter> Socket::connect(const char* address, std::shared_ptr<ReaderWriter> Socket::connect(const char* address,
const char* port) { const char* port) {
auto shared = Shared::create(address, port); auto shared = Shared::create(address, port);
if (::connect(shared->socket(), shared->info.ai_addr, if (::connect(shared->socket(), shared->info->ai_addr,
(int)shared->info.ai_addrlen) == 0) { (int)shared->info->ai_addrlen) == 0) {
return shared; return shared;
} }
return {}; return {};