Skip to content

Commit 091aaf2

Browse files
theuniFuzzbawls
authored andcommitted
net: handle nodesignals in CConnman
1 parent 1e9fa0f commit 091aaf2

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
@@ -408,16 +408,17 @@ void InitializeNode(NodeId nodeid, const CNode* pnode)
408408
state.address = pnode->addr;
409409
}
410410

411-
void FinalizeNode(NodeId nodeid)
411+
void FinalizeNode(NodeId nodeid, bool& fUpdateConnectionTime)
412412
{
413+
fUpdateConnectionTime = false;
413414
LOCK(cs_main);
414415
CNodeState* state = State(nodeid);
415416

416417
if (state->fSyncStarted)
417418
nSyncStarted--;
418419

419420
if (state->nMisbehavior == 0 && state->fCurrentlyConnected) {
420-
AddressCurrentlyConnected(state->address);
421+
fUpdateConnectionTime = true;
421422
}
422423

423424
for (const QueuedBlock& entry : state->vBlocksInFlight)

src/net.cpp

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -350,12 +350,6 @@ bool IsReachable(const CNetAddr& addr)
350350
return IsReachable(net);
351351
}
352352

353-
void AddressCurrentlyConnected(const CService& addr)
354-
{
355-
addrman.Connected(addr);
356-
}
357-
358-
359353
uint64_t CNode::nTotalBytesRecv = 0;
360354
uint64_t CNode::nTotalBytesSent = 0;
361355
RecursiveMutex CNode::cs_totalBytesRecv;
@@ -441,6 +435,7 @@ CNode* CConnman::ConnectNode(CAddress addrConnect, const char* pszDest, bool fCo
441435

442436
// Add node
443437
CNode* pnode = new CNode(hSocket, addrConnect, pszDest ? pszDest : "", false);
438+
GetNodeSignals().InitializeNode(pnode->GetId(), pnode);
444439
pnode->AddRef();
445440

446441
{
@@ -1067,6 +1062,7 @@ void CConnman::AcceptConnection(const ListenSocket& hListenSocket) {
10671062
}
10681063

10691064
CNode* pnode = new CNode(hSocket, addr, "", true);
1065+
GetNodeSignals().InitializeNode(pnode->GetId(), pnode);
10701066
pnode->AddRef();
10711067
pnode->fWhitelisted = whitelisted;
10721068

@@ -1128,7 +1124,7 @@ void CConnman::ThreadSocketHandler()
11281124
}
11291125
if (fDelete) {
11301126
vNodesDisconnected.remove(pnode);
1131-
delete pnode;
1127+
DeleteNode(pnode);
11321128
}
11331129
}
11341130
}
@@ -2021,6 +2017,7 @@ bool CConnman::Start(boost::thread_group& threadGroup, std::string& strNodeError
20212017
CNetAddr local;
20222018
LookupHost("127.0.0.1", local, false);
20232019
pnodeLocalHost = new CNode(INVALID_SOCKET, CAddress(CService(local, 0), nLocalServices));
2020+
GetNodeSignals().InitializeNode(pnodeLocalHost->GetId(), pnodeLocalHost);
20242021
}
20252022

20262023
//
@@ -2104,19 +2101,32 @@ void CConnman::Stop()
21042101
LogPrintf("CloseSocket(hListenSocket) failed with error %s\n", NetworkErrorString(WSAGetLastError()));
21052102

21062103
// clean up some globals (to help leak detection)
2107-
for(CNode* pnode : vNodes)
2108-
delete pnode;
2109-
for(CNode* pnode : vNodesDisconnected)
2110-
delete pnode;
2104+
for(CNode* pnode : vNodes) {
2105+
DeleteNode(pnode);
2106+
}
2107+
for(CNode* pnode : vNodesDisconnected) {
2108+
DeleteNode(pnode);
2109+
}
21112110
vNodes.clear();
21122111
vNodesDisconnected.clear();
21132112
vhListenSocket.clear();
21142113
delete semOutbound;
21152114
semOutbound = NULL;
2116-
delete pnodeLocalHost;
2115+
if(pnodeLocalHost)
2116+
DeleteNode(pnodeLocalHost);
21172117
pnodeLocalHost = NULL;
21182118
}
21192119

2120+
void CConnman::DeleteNode(CNode* pnode)
2121+
{
2122+
assert(pnode);
2123+
bool fUpdateConnectionTime = false;
2124+
GetNodeSignals().FinalizeNode(pnode->GetId(), fUpdateConnectionTime);
2125+
if(fUpdateConnectionTime)
2126+
addrman.Connected(pnode->addr);
2127+
delete pnode;
2128+
}
2129+
21202130
CConnman::~CConnman()
21212131
{
21222132
}
@@ -2301,8 +2311,6 @@ CNode::CNode(SOCKET hSocketIn, CAddress addrIn, std::string addrNameIn, bool fIn
23012311
// Be shy and don't send version until we hear
23022312
if (hSocket != INVALID_SOCKET && !fInbound)
23032313
PushVersion();
2304-
2305-
GetNodeSignals().InitializeNode(GetId(), this);
23062314
}
23072315

23082316
CNode::~CNode()
@@ -2311,8 +2319,6 @@ CNode::~CNode()
23112319

23122320
if (pfilter)
23132321
delete pfilter;
2314-
2315-
GetNodeSignals().FinalizeNode(GetId());
23162322
}
23172323

23182324
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
};
@@ -156,7 +157,7 @@ struct CNodeSignals
156157
boost::signals2::signal<bool (CNode*, CConnman&), CombinerAll> ProcessMessages;
157158
boost::signals2::signal<bool (CNode*, CConnman&), CombinerAll> SendMessages;
158159
boost::signals2::signal<void (NodeId, const CNode*)> InitializeNode;
159-
boost::signals2::signal<void (NodeId)> FinalizeNode;
160+
boost::signals2::signal<void (NodeId, bool&)> FinalizeNode;
160161
};
161162

162163

src/test/DoS_tests.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ BOOST_AUTO_TEST_CASE(DoS_banning)
5555
CNode::ClearBanned();
5656
CAddress addr1(ip(0xa0b0c001), NODE_NONE);
5757
CNode dummyNode1(INVALID_SOCKET, addr1, "", true);
58+
GetNodeSignals().InitializeNode(dummyNode1.GetId(), &dummyNode1);
5859
dummyNode1.nVersion = 1;
5960
misbehave(dummyNode1.GetId(), 100); // Should get banned
6061
SendMessages(&dummyNode1, *connman);
@@ -63,6 +64,7 @@ BOOST_AUTO_TEST_CASE(DoS_banning)
6364

6465
CAddress addr2(ip(0xa0b0c002), NODE_NONE);
6566
CNode dummyNode2(INVALID_SOCKET, addr2, "", true);
67+
GetNodeSignals().InitializeNode(dummyNode2.GetId(), &dummyNode2);
6668
dummyNode2.nVersion = 1;
6769
misbehave(dummyNode2.GetId(), 50);
6870
SendMessages(&dummyNode2, *connman);
@@ -79,6 +81,7 @@ BOOST_AUTO_TEST_CASE(DoS_banscore)
7981
mapArgs["-banscore"] = "111"; // because 11 is my favorite number
8082
CAddress addr1(ip(0xa0b0c001), NODE_NONE);
8183
CNode dummyNode1(INVALID_SOCKET, addr1, "", true);
84+
GetNodeSignals().InitializeNode(dummyNode1.GetId(), &dummyNode1);
8285
dummyNode1.nVersion = 1;
8386
misbehave(dummyNode1.GetId(), 100);
8487
SendMessages(&dummyNode1, *connman);
@@ -100,6 +103,7 @@ BOOST_AUTO_TEST_CASE(DoS_bantime)
100103

101104
CAddress addr(ip(0xa0b0c001), NODE_NONE);
102105
CNode dummyNode(INVALID_SOCKET, addr, "", true);
106+
GetNodeSignals().InitializeNode(dummyNode.GetId(), &dummyNode);
103107
dummyNode.nVersion = 1;
104108

105109
misbehave(dummyNode.GetId(), 100);

0 commit comments

Comments
 (0)