@@ -3547,6 +3547,17 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect, CDe
35473547                continue ;
35483548            }
35493549
3550+             //  Do not make automatic outbound connections to addnode peers, to
3551+             //  not use our limited outbound slots for them and to ensure
3552+             //  addnode connections benefit from their intended protections.
3553+             if  (AddedNodesContain (addr)) {
3554+                 LogPrint (BCLog::NET, " Not making automatic %s%s connection to %s peer selected for manual (addnode) connection%s\n " 
3555+                          preferred_net.has_value () ? " network-specific " " " 
3556+                          ConnectionTypeAsString (conn_type), GetNetworkName (addr.GetNetwork ()),
3557+                          fLogIPs  ? strprintf (" : %s" ToStringAddrPort ()) : " " 
3558+                 continue ;
3559+             }
3560+ 
35503561            addrConnect = addr;
35513562            break ;
35523563        }
@@ -4581,6 +4592,17 @@ bool CConnman::RemoveAddedNode(const std::string& strNode)
45814592    return  false ;
45824593}
45834594
4595+ bool  CConnman::AddedNodesContain (const  CAddress& addr) const 
4596+ {
4597+     AssertLockNotHeld (m_added_nodes_mutex);
4598+     const  std::string addr_str{addr.ToStringAddr ()};
4599+     const  std::string addr_port_str{addr.ToStringAddrPort ()};
4600+     LOCK (m_added_nodes_mutex);
4601+     return  (m_added_node_params.size () < 24  //  bound the query to a reasonable limit
4602+             && std::any_of (m_added_node_params.cbegin (), m_added_node_params.cend (),
4603+                            [&](const  auto & p) { return  p.m_added_node  == addr_str || p.m_added_node  == addr_port_str; }));
4604+ }
4605+ 
45844606bool  CConnman::AddPendingMasternode (const  uint256& proTxHash)
45854607{
45864608    LOCK (cs_vPendingMasternodes);
0 commit comments