From deffbea75ffcbf2d09f30ec1aed02d56c3a5c817 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 23 Jan 2024 10:58:42 +0100 Subject: [PATCH] HTTPClient: Fix socket leak on connect failure --- Common/Net/HTTPClient.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Common/Net/HTTPClient.cpp b/Common/Net/HTTPClient.cpp index 2b7ec91b4116..00e07d0b4563 100644 --- a/Common/Net/HTTPClient.cpp +++ b/Common/Net/HTTPClient.cpp @@ -127,6 +127,14 @@ bool Connection::Connect(int maxTries, double timeout, bool *cancelConnect) { ERROR_LOG(IO, "Bad socket"); continue; } + // Windows sockets aren't limited by socket number, just by count, so checking FD_SETSIZE there is wrong. +#if !PPSSPP_PLATFORM(WINDOWS) + if (sock >= FD_SETSIZE) { + ERROR_LOG(IO, "Socket doesn't fit in FD_SET: %d We probably have a leak.", sock); + closesocket(sock); + continue; + } +#endif fd_util::SetNonBlocking(sock, true); // Start trying to connect (async with timeout.) @@ -194,6 +202,11 @@ bool Connection::Connect(int maxTries, double timeout, bool *cancelConnect) { // Great, now we're good to go. return true; + } else { + // Fail. Close all the sockets. + for (int sock : sockets) { + closesocket(sock); + } } if (cancelConnect && *cancelConnect) {