summaryrefslogtreecommitdiff
path: root/src/network
diff options
context:
space:
mode:
authorPatric Stout <truebrain@openttd.org>2021-05-08 11:57:41 +0200
committerGitHub <noreply@github.com>2021-05-08 11:57:41 +0200
commitf187708b3b6bcb95a0d92908f8a90c1431ca2578 (patch)
treee9d4606dd161d1d2046dddc1c1cef748e283e6e0 /src/network
parent8c3fa2a3bf079424529a49b58f0466e4285d5874 (diff)
downloadopenttd-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.h4
-rw-r--r--src/network/core/tcp_connect.cpp12
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);