Skip to content

Commit aaf018e

Browse files
committed
net: handle nodesignals in CConnman
1 parent b1a5f43 commit aaf018e

File tree

4 files changed

+31
-19
lines changed

4 files changed

+31
-19
lines changed

src/main.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -348,15 +348,16 @@ void InitializeNode(NodeId nodeid, const CNode *pnode) {
348348
state.address = pnode->addr;
349349
}
350350

351-
void FinalizeNode(NodeId nodeid) {
351+
void FinalizeNode(NodeId nodeid, bool& fUpdateConnectionTime) {
352+
fUpdateConnectionTime = false;
352353
LOCK(cs_main);
353354
CNodeState *state = State(nodeid);
354355

355356
if (state->fSyncStarted)
356357
nSyncStarted--;
357358

358359
if (state->nMisbehavior == 0 && state->fCurrentlyConnected) {
359-
AddressCurrentlyConnected(state->address);
360+
fUpdateConnectionTime = true;
360361
}
361362

362363
BOOST_FOREACH(const QueuedBlock& entry, state->vBlocksInFlight) {

src/net.cpp

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -313,12 +313,6 @@ bool IsReachable(const CNetAddr& addr)
313313
return IsReachable(net);
314314
}
315315

316-
void AddressCurrentlyConnected(const CService& addr)
317-
{
318-
addrman.Connected(addr);
319-
}
320-
321-
322316
uint64_t CNode::nTotalBytesRecv = 0;
323317
uint64_t CNode::nTotalBytesSent = 0;
324318
CCriticalSection CNode::cs_totalBytesRecv;
@@ -431,6 +425,7 @@ CNode* CConnman::ConnectNode(CAddress addrConnect, const char *pszDest, bool fCo
431425

432426
// Add node
433427
CNode* pnode = new CNode(hSocket, addrConnect, pszDest ? pszDest : "", false);
428+
GetNodeSignals().InitializeNode(pnode->GetId(), pnode);
434429
pnode->AddRef();
435430

436431
{
@@ -1070,6 +1065,7 @@ void CConnman::AcceptConnection(const ListenSocket& hListenSocket) {
10701065
}
10711066

10721067
CNode* pnode = new CNode(hSocket, addr, "", true);
1068+
GetNodeSignals().InitializeNode(pnode->GetId(), pnode);
10731069
pnode->AddRef();
10741070
pnode->fWhitelisted = whitelisted;
10751071

@@ -1139,7 +1135,7 @@ void CConnman::ThreadSocketHandler()
11391135
if (fDelete)
11401136
{
11411137
vNodesDisconnected.remove(pnode);
1142-
delete pnode;
1138+
DeleteNode(pnode);
11431139
}
11441140
}
11451141
}
@@ -2119,6 +2115,7 @@ bool CConnman::Start(boost::thread_group& threadGroup, std::string& strNodeError
21192115
CNetAddr local;
21202116
LookupHost("127.0.0.1", local, false);
21212117
pnodeLocalHost = new CNode(INVALID_SOCKET, CAddress(CService(local, 0), nLocalServices));
2118+
GetNodeSignals().InitializeNode(pnodeLocalHost->GetId(), pnodeLocalHost);
21222119
}
21232120

21242121
//
@@ -2194,19 +2191,32 @@ void CConnman::Stop()
21942191
LogPrintf("CloseSocket(hListenSocket) failed with error %s\n", NetworkErrorString(WSAGetLastError()));
21952192

21962193
// clean up some globals (to help leak detection)
2197-
BOOST_FOREACH(CNode *pnode, vNodes)
2198-
delete pnode;
2199-
BOOST_FOREACH(CNode *pnode, vNodesDisconnected)
2200-
delete pnode;
2194+
BOOST_FOREACH(CNode *pnode, vNodes) {
2195+
DeleteNode(pnode);
2196+
}
2197+
BOOST_FOREACH(CNode *pnode, vNodesDisconnected) {
2198+
DeleteNode(pnode);
2199+
}
22012200
vNodes.clear();
22022201
vNodesDisconnected.clear();
22032202
vhListenSocket.clear();
22042203
delete semOutbound;
22052204
semOutbound = NULL;
2206-
delete pnodeLocalHost;
2205+
if(pnodeLocalHost)
2206+
DeleteNode(pnodeLocalHost);
22072207
pnodeLocalHost = NULL;
22082208
}
22092209

2210+
void CConnman::DeleteNode(CNode* pnode)
2211+
{
2212+
assert(pnode);
2213+
bool fUpdateConnectionTime = false;
2214+
GetNodeSignals().FinalizeNode(pnode->GetId(), fUpdateConnectionTime);
2215+
if(fUpdateConnectionTime)
2216+
addrman.Connected(pnode->addr);
2217+
delete pnode;
2218+
}
2219+
22102220
CConnman::~CConnman()
22112221
{
22122222
}
@@ -2442,8 +2452,6 @@ CNode::CNode(SOCKET hSocketIn, const CAddress& addrIn, const std::string& addrNa
24422452
// Be shy and don't send version until we hear
24432453
if (hSocket != INVALID_SOCKET && !fInbound)
24442454
PushVersion();
2445-
2446-
GetNodeSignals().InitializeNode(GetId(), this);
24472455
}
24482456

24492457
CNode::~CNode()
@@ -2452,8 +2460,6 @@ CNode::~CNode()
24522460

24532461
if (pfilter)
24542462
delete pfilter;
2455-
2456-
GetNodeSignals().FinalizeNode(GetId());
24572463
}
24582464

24592465
void CNode::AskFor(const CInv& inv)

src/net.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ class CConnman
121121
void ThreadDNSAddressSeed();
122122

123123
CNode* ConnectNode(CAddress addrConnect, const char *pszDest, bool fCountFailure);
124+
void DeleteNode(CNode* pnode);
124125

125126
std::vector<ListenSocket> vhListenSocket;
126127
};
@@ -154,7 +155,7 @@ struct CNodeSignals
154155
boost::signals2::signal<bool (CNode*, CConnman&), CombinerAll> ProcessMessages;
155156
boost::signals2::signal<bool (CNode*, CConnman&), CombinerAll> SendMessages;
156157
boost::signals2::signal<void (NodeId, const CNode*)> InitializeNode;
157-
boost::signals2::signal<void (NodeId)> FinalizeNode;
158+
boost::signals2::signal<void (NodeId, bool&)> FinalizeNode;
158159
};
159160

160161

src/test/DoS_tests.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ BOOST_AUTO_TEST_CASE(DoS_banning)
4747
CNode::ClearBanned();
4848
CAddress addr1(ip(0xa0b0c001), NODE_NONE);
4949
CNode dummyNode1(INVALID_SOCKET, addr1, "", true);
50+
GetNodeSignals().InitializeNode(dummyNode1.GetId(), &dummyNode1);
5051
dummyNode1.nVersion = 1;
5152
Misbehaving(dummyNode1.GetId(), 100); // Should get banned
5253
SendMessages(&dummyNode1, *connman);
@@ -55,6 +56,7 @@ BOOST_AUTO_TEST_CASE(DoS_banning)
5556

5657
CAddress addr2(ip(0xa0b0c002), NODE_NONE);
5758
CNode dummyNode2(INVALID_SOCKET, addr2, "", true);
59+
GetNodeSignals().InitializeNode(dummyNode2.GetId(), &dummyNode2);
5860
dummyNode2.nVersion = 1;
5961
Misbehaving(dummyNode2.GetId(), 50);
6062
SendMessages(&dummyNode2, *connman);
@@ -71,6 +73,7 @@ BOOST_AUTO_TEST_CASE(DoS_banscore)
7173
mapArgs["-banscore"] = "111"; // because 11 is my favorite number
7274
CAddress addr1(ip(0xa0b0c001), NODE_NONE);
7375
CNode dummyNode1(INVALID_SOCKET, addr1, "", true);
76+
GetNodeSignals().InitializeNode(dummyNode1.GetId(), &dummyNode1);
7477
dummyNode1.nVersion = 1;
7578
Misbehaving(dummyNode1.GetId(), 100);
7679
SendMessages(&dummyNode1, *connman);
@@ -92,6 +95,7 @@ BOOST_AUTO_TEST_CASE(DoS_bantime)
9295

9396
CAddress addr(ip(0xa0b0c001), NODE_NONE);
9497
CNode dummyNode(INVALID_SOCKET, addr, "", true);
98+
GetNodeSignals().InitializeNode(dummyNode.GetId(), &dummyNode);
9599
dummyNode.nVersion = 1;
96100

97101
Misbehaving(dummyNode.GetId(), 100);

0 commit comments

Comments
 (0)