From 81a12158fc2fad96eb9b15de2ebcb8d2f8083d3a Mon Sep 17 00:00:00 2001 From: SChernykh Date: Fri, 27 Aug 2021 16:36:06 +0200 Subject: [PATCH] P2PServer: don't add banned peers back to the peer list --- src/p2p_server.cpp | 8 +++++--- src/tcp_server.h | 2 ++ src/tcp_server.inl | 39 +++++++++++++++++++++------------------ 3 files changed, 28 insertions(+), 21 deletions(-) diff --git a/src/p2p_server.cpp b/src/p2p_server.cpp index a2b5abc..3bf8693 100644 --- a/src/p2p_server.cpp +++ b/src/p2p_server.cpp @@ -364,7 +364,7 @@ void P2PServer::load_saved_peer_list() } } - if (!already_added) { + if (!already_added && !is_banned(p.m_addr)) { m_peerList.push_back(p); } }); @@ -383,7 +383,9 @@ void P2PServer::update_peer_in_list(bool is_v6, const raw_ip& ip, int port) } } - m_peerList.emplace_back(Peer{ is_v6, ip, port, 0 }); + if (!is_banned(ip)) { + m_peerList.emplace_back(Peer{ is_v6, ip, port, 0 }); + } } void P2PServer::remove_peer_from_list(P2PClient* client) @@ -1343,7 +1345,7 @@ bool P2PServer::P2PClient::on_peer_list_response(const uint8_t* buf) const } } - if (!already_added) { + if (!already_added && !server->is_banned(ip)) { server->m_peerList.emplace_back(Peer{ is_v6, ip, port, 0 }); } } diff --git a/src/tcp_server.h b/src/tcp_server.h index c2774bd..80e3aeb 100644 --- a/src/tcp_server.h +++ b/src/tcp_server.h @@ -193,6 +193,8 @@ protected: uv_mutex_t m_bansLock; std::map m_bans; + bool is_banned(const raw_ip& ip); + uv_mutex_t m_pendingConnectionsLock; std::set m_pendingConnections; diff --git a/src/tcp_server.inl b/src/tcp_server.inl index 0454497..d0321fb 100644 --- a/src/tcp_server.inl +++ b/src/tcp_server.inl @@ -312,18 +312,26 @@ void TCPServer::on_connect_failed(bool, const raw { } +template +bool TCPServer::is_banned(const raw_ip& ip) +{ + MutexLock lock(m_bansLock); + + auto it = m_bans.find(ip); + if ((it != m_bans.end()) && (time(nullptr) < it->second)) { + return true; + } + + return false; +} + template bool TCPServer::connect_to_peer_nolock(Client* client, bool is_v6, const sockaddr* addr) { - { - MutexLock lock(m_bansLock); - - auto it = m_bans.find(client->m_addr); - if ((it != m_bans.end()) && (time(nullptr) < it->second)) { - LOGINFO(5, "peer " << log::Gray() << static_cast(client->m_addrString) << log::NoColor() << " is banned, not connecting to it"); - m_preallocatedClients.push_back(client); - return false; - } + if (is_banned(client->m_addr)) { + LOGINFO(5, "peer " << log::Gray() << static_cast(client->m_addrString) << log::NoColor() << " is banned, not connecting to it"); + m_preallocatedClients.push_back(client); + return false; } client->m_isV6 = is_v6; @@ -719,15 +727,10 @@ void TCPServer::on_new_client_nolock(uv_stream_t* client->m_isIncoming = false; } - { - MutexLock lock(m_bansLock); - - auto it = m_bans.find(client->m_addr); - if ((it != m_bans.end()) && (time(nullptr) < it->second)) { - LOGINFO(5, "peer " << log::Gray() << static_cast(client->m_addrString) << log::NoColor() << " is banned, disconnecting"); - client->close(); - return; - } + if (is_banned(client->m_addr)) { + LOGINFO(5, "peer " << log::Gray() << static_cast(client->m_addrString) << log::NoColor() << " is banned, disconnecting"); + client->close(); + return; } if (client->m_owner->m_finished.load() || !client->on_connect()) {