From 20f23e0e31a687a38c57d31faa232c1124b89ade Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Mon, 4 Jan 2016 13:08:00 -0800 Subject: [PATCH] TCPConnector: Don't leak socket descriptors. Also check to see if socket() returns error (less than 0) and error out. --- src/tcpsockets/TCPConnector.cpp | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/tcpsockets/TCPConnector.cpp b/src/tcpsockets/TCPConnector.cpp index 665500db18..82e03ebb4a 100644 --- a/src/tcpsockets/TCPConnector.cpp +++ b/src/tcpsockets/TCPConnector.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #endif #include "TCPStream.h" @@ -100,8 +101,17 @@ std::unique_ptr TCPConnector::connect(const char* server, if (timeout == 0) { int sd = socket(AF_INET, SOCK_STREAM, 0); + if (sd < 0) { + ERROR("could not create socket"); + return nullptr; + } if (::connect(sd, (struct sockaddr*)&address, sizeof(address)) != 0) { ERROR("connect() to " << server << " port " << port << " failed: " << SocketStrerror()); +#ifdef _WIN32 + closesocket(sd); +#else + ::close(sd); +#endif return nullptr; } return std::unique_ptr(new TCPStream(sd, &address)); @@ -111,6 +121,10 @@ std::unique_ptr TCPConnector::connect(const char* server, struct timeval tv; socklen_t len; int result = -1, valopt, sd = socket(AF_INET, SOCK_STREAM, 0); + if (sd < 0) { + ERROR("could not create socket"); + return nullptr; + } // Set socket to non-blocking #ifdef _WIN32 @@ -161,7 +175,14 @@ std::unique_ptr TCPConnector::connect(const char* server, fcntl(sd, F_SETFL, arg); #endif - // Create stream object if connected - if (result == -1) return nullptr; + // Create stream object if connected, close if not. + if (result == -1) { +#ifdef _WIN32 + closesocket(sd); +#else + ::close(sd); +#endif + return nullptr; + } return std::unique_ptr(new TCPStream(sd, &address)); }