Avoid calling CAddrMan::Connected() on block-relay-only peer addresses
Connected() updates the time we serve in addr messages, so avoid leaking block-relay-only peer connections by avoiding these calls.
This commit is contained in:
1 parent
d67883d01e
commit
daf5553126
5 files changed
+12
-10
No files matched your search
+1
-1
@@ -2624,7 +2624,7 @@ void CConnman::DeleteNode(CNode* pnode)
|
|||||||
{
|
{
|
||||||
assert(pnode);
|
assert(pnode);
|
||||||
bool fUpdateConnectionTime = false;
|
bool fUpdateConnectionTime = false;
|
||||||
m_msgproc->FinalizeNode(pnode->GetId(), fUpdateConnectionTime);
|
m_msgproc->FinalizeNode(*pnode, fUpdateConnectionTime);
|
||||||
if (fUpdateConnectionTime) {
|
if (fUpdateConnectionTime) {
|
||||||
addrman.Connected(pnode->addr);
|
addrman.Connected(pnode->addr);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -618,7 +618,7 @@ public:
|
|||||||
virtual bool ProcessMessages(CNode* pnode, std::atomic<bool>& interrupt) = 0;
|
virtual bool ProcessMessages(CNode* pnode, std::atomic<bool>& interrupt) = 0;
|
||||||
virtual bool SendMessages(CNode* pnode) = 0;
|
virtual bool SendMessages(CNode* pnode) = 0;
|
||||||
virtual void InitializeNode(CNode* pnode) = 0;
|
virtual void InitializeNode(CNode* pnode) = 0;
|
||||||
virtual void FinalizeNode(NodeId id, bool& update_connection_time) = 0;
|
virtual void FinalizeNode(const CNode& node, bool& update_connection_time) = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -837,7 +837,8 @@ void PeerManager::ReattemptInitialBroadcast(CScheduler& scheduler) const
|
|||||||
scheduler.scheduleFromNow([&] { ReattemptInitialBroadcast(scheduler); }, delta);
|
scheduler.scheduleFromNow([&] { ReattemptInitialBroadcast(scheduler); }, delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PeerManager::FinalizeNode(NodeId nodeid, bool& fUpdateConnectionTime) {
|
void PeerManager::FinalizeNode(const CNode& node, bool& fUpdateConnectionTime) {
|
||||||
|
NodeId nodeid = node.GetId();
|
||||||
fUpdateConnectionTime = false;
|
fUpdateConnectionTime = false;
|
||||||
LOCK(cs_main);
|
LOCK(cs_main);
|
||||||
int misbehavior{0};
|
int misbehavior{0};
|
||||||
@@ -854,7 +855,8 @@ void PeerManager::FinalizeNode(NodeId nodeid, bool& fUpdateConnectionTime) {
|
|||||||
if (state->fSyncStarted)
|
if (state->fSyncStarted)
|
||||||
nSyncStarted--;
|
nSyncStarted--;
|
||||||
|
|
||||||
if (misbehavior == 0 && state->fCurrentlyConnected) {
|
if (misbehavior == 0 && state->fCurrentlyConnected && !node.IsBlockOnlyConn()) {
|
||||||
|
// Note: we avoid changing visible addrman state for block-relay-only peers
|
||||||
fUpdateConnectionTime = true;
|
fUpdateConnectionTime = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ public:
|
|||||||
/** Initialize a peer by adding it to mapNodeState and pushing a message requesting its version */
|
/** Initialize a peer by adding it to mapNodeState and pushing a message requesting its version */
|
||||||
void InitializeNode(CNode* pnode) override;
|
void InitializeNode(CNode* pnode) override;
|
||||||
/** Handle removal of a peer by updating various state and removing it from mapNodeState */
|
/** Handle removal of a peer by updating various state and removing it from mapNodeState */
|
||||||
void FinalizeNode(NodeId nodeid, bool& fUpdateConnectionTime) override;
|
void FinalizeNode(const CNode& node, bool& fUpdateConnectionTime) override;
|
||||||
/**
|
/**
|
||||||
* Process protocol messages received from a given node
|
* Process protocol messages received from a given node
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ BOOST_AUTO_TEST_CASE(outbound_slow_chain_eviction)
|
|||||||
SetMockTime(0);
|
SetMockTime(0);
|
||||||
|
|
||||||
bool dummy;
|
bool dummy;
|
||||||
peerLogic->FinalizeNode(dummyNode1.GetId(), dummy);
|
peerLogic->FinalizeNode(dummyNode1, dummy);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void AddRandomOutboundPeer(std::vector<CNode *> &vNodes, PeerManager &peerLogic, CConnmanTest* connman)
|
static void AddRandomOutboundPeer(std::vector<CNode *> &vNodes, PeerManager &peerLogic, CConnmanTest* connman)
|
||||||
@@ -211,7 +211,7 @@ BOOST_AUTO_TEST_CASE(stale_tip_peer_management)
|
|||||||
|
|
||||||
bool dummy;
|
bool dummy;
|
||||||
for (const CNode *node : vNodes) {
|
for (const CNode *node : vNodes) {
|
||||||
peerLogic->FinalizeNode(node->GetId(), dummy);
|
peerLogic->FinalizeNode(*node, dummy);
|
||||||
}
|
}
|
||||||
|
|
||||||
connman->ClearNodes();
|
connman->ClearNodes();
|
||||||
@@ -259,8 +259,8 @@ BOOST_AUTO_TEST_CASE(peer_discouragement)
|
|||||||
BOOST_CHECK(banman->IsDiscouraged(addr2)); // to be discouraged now
|
BOOST_CHECK(banman->IsDiscouraged(addr2)); // to be discouraged now
|
||||||
|
|
||||||
bool dummy;
|
bool dummy;
|
||||||
peerLogic->FinalizeNode(dummyNode1.GetId(), dummy);
|
peerLogic->FinalizeNode(dummyNode1, dummy);
|
||||||
peerLogic->FinalizeNode(dummyNode2.GetId(), dummy);
|
peerLogic->FinalizeNode(dummyNode2, dummy);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(DoS_bantime)
|
BOOST_AUTO_TEST_CASE(DoS_bantime)
|
||||||
@@ -288,7 +288,7 @@ BOOST_AUTO_TEST_CASE(DoS_bantime)
|
|||||||
BOOST_CHECK(banman->IsDiscouraged(addr));
|
BOOST_CHECK(banman->IsDiscouraged(addr));
|
||||||
|
|
||||||
bool dummy;
|
bool dummy;
|
||||||
peerLogic->FinalizeNode(dummyNode.GetId(), dummy);
|
peerLogic->FinalizeNode(dummyNode, dummy);
|
||||||
}
|
}
|
||||||
|
|
||||||
static CTransactionRef RandomOrphan()
|
static CTransactionRef RandomOrphan()
|
||||||
|
|||||||
Reference in new issue
Block a user