mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-13 11:25:02 -05:00
Call CAddrMan::Good() on block-relay-only peer addresses
Being able to invoke Good() is important for address management (new vs tried table, tried table eviction via test-before-evict). We mitigate potential information leaks by not calling Connected() on these peer addresses.
This commit is contained in:
parent
daf5553126
commit
4fe338ab3e
1 changed files with 18 additions and 10 deletions
|
@ -2407,14 +2407,8 @@ void PeerManager::ProcessMessage(CNode& pfrom, const std::string& msg_type, CDat
|
||||||
// empty and no one will know who we are, so these mechanisms are
|
// empty and no one will know who we are, so these mechanisms are
|
||||||
// important to help us connect to the network.
|
// important to help us connect to the network.
|
||||||
//
|
//
|
||||||
// We also update the addrman to record connection success for
|
// We skip this for BLOCK_RELAY peers to avoid potentially leaking
|
||||||
// these peers (which include OUTBOUND_FULL_RELAY and FEELER
|
// information about our BLOCK_RELAY connections via address relay.
|
||||||
// connections) so that addrman will have an up-to-date notion of
|
|
||||||
// which peers are online and available.
|
|
||||||
//
|
|
||||||
// We skip these operations for BLOCK_RELAY peers to avoid
|
|
||||||
// potentially leaking information about our BLOCK_RELAY
|
|
||||||
// connections via the addrman or address relay.
|
|
||||||
if (fListen && !::ChainstateActive().IsInitialBlockDownload())
|
if (fListen && !::ChainstateActive().IsInitialBlockDownload())
|
||||||
{
|
{
|
||||||
CAddress addr = GetLocalAddress(&pfrom.addr, pfrom.GetLocalServices());
|
CAddress addr = GetLocalAddress(&pfrom.addr, pfrom.GetLocalServices());
|
||||||
|
@ -2433,9 +2427,23 @@ void PeerManager::ProcessMessage(CNode& pfrom, const std::string& msg_type, CDat
|
||||||
// Get recent addresses
|
// Get recent addresses
|
||||||
m_connman.PushMessage(&pfrom, CNetMsgMaker(greatest_common_version).Make(NetMsgType::GETADDR));
|
m_connman.PushMessage(&pfrom, CNetMsgMaker(greatest_common_version).Make(NetMsgType::GETADDR));
|
||||||
pfrom.fGetAddr = true;
|
pfrom.fGetAddr = true;
|
||||||
|
}
|
||||||
|
|
||||||
// Moves address from New to Tried table in Addrman, resolves
|
if (!pfrom.IsInboundConn()) {
|
||||||
// tried-table collisions, etc.
|
// For non-inbound connections, we update the addrman to record
|
||||||
|
// connection success so that addrman will have an up-to-date
|
||||||
|
// notion of which peers are online and available.
|
||||||
|
//
|
||||||
|
// While we strive to not leak information about block-relay-only
|
||||||
|
// connections via the addrman, not moving an address to the tried
|
||||||
|
// table is also potentially detrimental because new-table entries
|
||||||
|
// are subject to eviction in the event of addrman collisions. We
|
||||||
|
// mitigate the information-leak by never calling
|
||||||
|
// CAddrMan::Connected() on block-relay-only peers; see
|
||||||
|
// FinalizeNode().
|
||||||
|
//
|
||||||
|
// This moves an address from New to Tried table in Addrman,
|
||||||
|
// resolves tried-table collisions, etc.
|
||||||
m_connman.MarkAddressGood(pfrom.addr);
|
m_connman.MarkAddressGood(pfrom.addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue