diff options
author | Patric Stout <truebrain@openttd.org> | 2021-05-08 11:57:41 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-08 11:57:41 +0200 |
commit | f187708b3b6bcb95a0d92908f8a90c1431ca2578 (patch) | |
tree | e9d4606dd161d1d2046dddc1c1cef748e283e6e0 /src/network | |
parent | 8c3fa2a3bf079424529a49b58f0466e4285d5874 (diff) | |
download | openttd-f187708b3b6bcb95a0d92908f8a90c1431ca2578.tar.xz |
Fix f7e390bd: getpeername() doesn't work on closed sockets (#9213)
Diffstat (limited to 'src/network')
-rw-r--r-- | src/network/core/tcp.h | 4 | ||||
-rw-r--r-- | src/network/core/tcp_connect.cpp | 12 |
2 files changed, 13 insertions, 3 deletions
diff --git a/src/network/core/tcp.h b/src/network/core/tcp.h index b90ce0232..624555649 100644 --- a/src/network/core/tcp.h +++ b/src/network/core/tcp.h @@ -15,8 +15,9 @@ #include "address.h" #include "packet.h" -#include <chrono> #include <atomic> +#include <chrono> +#include <map> /** The states of sending the packets. */ enum SendPacketsState { @@ -66,6 +67,7 @@ class TCPConnecter { private: addrinfo *ai = nullptr; ///< getaddrinfo() allocated linked-list of resolved addresses. std::vector<addrinfo *> addresses; ///< Addresses we can connect to. + std::map<SOCKET, NetworkAddress> sock_to_address; ///< Mapping of a socket to the real address it is connecting to. USed for DEBUG statements. size_t current_address = 0; ///< Current index in addresses we are trying. std::vector<SOCKET> sockets; ///< Pending connect() attempts. diff --git a/src/network/core/tcp_connect.cpp b/src/network/core/tcp_connect.cpp index cca9f09b7..a1e369295 100644 --- a/src/network/core/tcp_connect.cpp +++ b/src/network/core/tcp_connect.cpp @@ -40,8 +40,10 @@ TCPConnecter::TCPConnecter(const std::string &connection_string, uint16 default_ TCPConnecter::~TCPConnecter() { for (const auto &socket : this->sockets) { - close(socket); + closesocket(socket); } + this->sockets.clear(); + this->sock_to_address.clear(); freeaddrinfo(this->ai); } @@ -72,6 +74,7 @@ void TCPConnecter::Connect(addrinfo *address) return; } + this->sock_to_address[sock] = network_address; this->sockets.push_back(sock); } @@ -245,6 +248,9 @@ bool TCPConnecter::CheckActivity() for (const auto &socket : this->sockets) { closesocket(socket); } + this->sockets.clear(); + this->sock_to_address.clear(); + this->OnFailure(); return true; } @@ -253,8 +259,9 @@ bool TCPConnecter::CheckActivity() for (auto it = this->sockets.begin(); it != this->sockets.end(); /* nothing */) { NetworkError socket_error = GetSocketError(*it); if (socket_error.HasError()) { - DEBUG(net, 1, "Could not connect to %s: %s", NetworkAddress::GetPeerName(*it).c_str(), socket_error.AsString()); + DEBUG(net, 1, "Could not connect to %s: %s", this->sock_to_address[*it].GetAddressAsString().c_str(), socket_error.AsString()); closesocket(*it); + this->sock_to_address.erase(*it); it = this->sockets.erase(it); } else { it++; @@ -280,6 +287,7 @@ bool TCPConnecter::CheckActivity() } else { closesocket(*it); } + this->sock_to_address.erase(*it); it = this->sockets.erase(it); } assert(connected_socket != INVALID_SOCKET); |