upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/src/net.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/net.cpp')
-rw-r--r--src/net.cpp17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/net.cpp b/src/net.cpp
index 3660735..6e74cbb 100644
--- a/src/net.cpp
+++ b/src/net.cpp
@@ -1622,12 +1622,29 @@ void ThreadSocketHandler2(void* parg)
1622 unsigned int nNodes = 0; 1622 unsigned int nNodes = 0;
1623 CRITICAL_BLOCK(cs_vNodes) 1623 CRITICAL_BLOCK(cs_vNodes)
1624 nNodes = (unsigned int)vNodes.size(); 1624 nNodes = (unsigned int)vNodes.size();
1625 // Also count how many connections this one address already
1626 // holds. A single IP that keeps opening sockets -- a broken
1627 // node or a deliberate connection-exhaustion flood -- must not
1628 // be able to take the whole table, which is what starved the
1629 // relays.
1630 unsigned int nFromThisIP = 0;
1631 CRITICAL_BLOCK(cs_vNodes)
1632 for (vector<CNode*>::iterator it = vNodes.begin(); it != vNodes.end(); ++it)
1633 if ((*it)->addr.ip == addr.ip)
1634 nFromThisIP++;
1635
1625 if (nNodes >= MAX_CONNECTIONS) 1636 if (nNodes >= MAX_CONNECTIONS)
1626 { 1637 {
1627 LogPrint("net", "refusing connection from %s, already at %u\n", 1638 LogPrint("net", "refusing connection from %s, already at %u\n",
1628 addr.ToString().c_str(), nNodes); 1639 addr.ToString().c_str(), nNodes);
1629 BtfCloseSocket(hSocket); 1640 BtfCloseSocket(hSocket);
1630 } 1641 }
1642 else if (nFromThisIP >= MAX_CONNECTIONS_PER_IP)
1643 {
1644 LogPrint("net", "refusing connection from %s, already %u from that address\n",
1645 addr.ToString().c_str(), nFromThisIP);
1646 BtfCloseSocket(hSocket);
1647 }
1631 else 1648 else
1632 { 1649 {
1633 LogPrint("net", "accepted connection from %s\n", addr.ToString().c_str()); 1650 LogPrint("net", "accepted connection from %s\n", addr.ToString().c_str());