mirror of https://github.com/OpenTTD/OpenTTD
Fix f7e390bd: getpeername() doesn't work on closed sockets (#9213)
parent
8c3fa2a3bf
commit
f187708b3b
|
@ -15,8 +15,9 @@
|
||||||
#include "address.h"
|
#include "address.h"
|
||||||
#include "packet.h"
|
#include "packet.h"
|
||||||
|
|
||||||
#include <chrono>
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
|
#include <chrono>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
/** The states of sending the packets. */
|
/** The states of sending the packets. */
|
||||||
enum SendPacketsState {
|
enum SendPacketsState {
|
||||||
|
@ -66,6 +67,7 @@ class TCPConnecter {
|
||||||
private:
|
private:
|
||||||
addrinfo *ai = nullptr; ///< getaddrinfo() allocated linked-list of resolved addresses.
|
addrinfo *ai = nullptr; ///< getaddrinfo() allocated linked-list of resolved addresses.
|
||||||
std::vector<addrinfo *> addresses; ///< Addresses we can connect to.
|
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.
|
size_t current_address = 0; ///< Current index in addresses we are trying.
|
||||||
|
|
||||||
std::vector<SOCKET> sockets; ///< Pending connect() attempts.
|
std::vector<SOCKET> sockets; ///< Pending connect() attempts.
|
||||||
|
|
|
@ -40,8 +40,10 @@ TCPConnecter::TCPConnecter(const std::string &connection_string, uint16 default_
|
||||||
TCPConnecter::~TCPConnecter()
|
TCPConnecter::~TCPConnecter()
|
||||||
{
|
{
|
||||||
for (const auto &socket : this->sockets) {
|
for (const auto &socket : this->sockets) {
|
||||||
close(socket);
|
closesocket(socket);
|
||||||
}
|
}
|
||||||
|
this->sockets.clear();
|
||||||
|
this->sock_to_address.clear();
|
||||||
|
|
||||||
freeaddrinfo(this->ai);
|
freeaddrinfo(this->ai);
|
||||||
}
|
}
|
||||||
|
@ -72,6 +74,7 @@ void TCPConnecter::Connect(addrinfo *address)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this->sock_to_address[sock] = network_address;
|
||||||
this->sockets.push_back(sock);
|
this->sockets.push_back(sock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -245,6 +248,9 @@ bool TCPConnecter::CheckActivity()
|
||||||
for (const auto &socket : this->sockets) {
|
for (const auto &socket : this->sockets) {
|
||||||
closesocket(socket);
|
closesocket(socket);
|
||||||
}
|
}
|
||||||
|
this->sockets.clear();
|
||||||
|
this->sock_to_address.clear();
|
||||||
|
|
||||||
this->OnFailure();
|
this->OnFailure();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -253,8 +259,9 @@ bool TCPConnecter::CheckActivity()
|
||||||
for (auto it = this->sockets.begin(); it != this->sockets.end(); /* nothing */) {
|
for (auto it = this->sockets.begin(); it != this->sockets.end(); /* nothing */) {
|
||||||
NetworkError socket_error = GetSocketError(*it);
|
NetworkError socket_error = GetSocketError(*it);
|
||||||
if (socket_error.HasError()) {
|
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);
|
closesocket(*it);
|
||||||
|
this->sock_to_address.erase(*it);
|
||||||
it = this->sockets.erase(it);
|
it = this->sockets.erase(it);
|
||||||
} else {
|
} else {
|
||||||
it++;
|
it++;
|
||||||
|
@ -280,6 +287,7 @@ bool TCPConnecter::CheckActivity()
|
||||||
} else {
|
} else {
|
||||||
closesocket(*it);
|
closesocket(*it);
|
||||||
}
|
}
|
||||||
|
this->sock_to_address.erase(*it);
|
||||||
it = this->sockets.erase(it);
|
it = this->sockets.erase(it);
|
||||||
}
|
}
|
||||||
assert(connected_socket != INVALID_SOCKET);
|
assert(connected_socket != INVALID_SOCKET);
|
||||||
|
|
Loading…
Reference in New Issue