diff --git a/src/net_processing.cpp b/src/net_processing.cpp index 4e102730fb7..c7061d52348 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -3600,7 +3600,7 @@ void PeerManagerImpl::ProcessMessage(Peer& peer, CNode& pfrom, const std::string } vRecv.ignore(8); // Ignore the addrMe service bits sent by the peer vRecv >> CNetAddr::V1(addrMe); - if (!pfrom.IsInboundConn()) + if (!pfrom.IsInboundConn() && !pfrom.IsPrivateBroadcastConn()) { // Overwrites potentially existing services. In contrast to this, // unvalidated services received via gossip relay in ADDR/ADDRV2 diff --git a/src/test/net_tests.cpp b/src/test/net_tests.cpp index 1fc8d526944..32801d97b8b 100644 --- a/src/test/net_tests.cpp +++ b/src/test/net_tests.cpp @@ -2,6 +2,7 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. +#include #include #include #include @@ -1559,4 +1560,34 @@ BOOST_AUTO_TEST_CASE(v2transport_test) } } +BOOST_AUTO_TEST_CASE(private_broadcast_version_does_not_update_addrman_services) +{ + LOCK(NetEventsInterface::g_msgproc_mutex); + + const CNetAddr source{LookupHost("2.3.4.5", /*fAllowLookup=*/false).value()}; + const CAddress addr{Lookup("1.2.3.4", 8333, /*fAllowLookup=*/false).value(), NODE_NONE}; + BOOST_REQUIRE(m_node.addrman->Add({addr}, source)); + CNode node{/*id=*/0, + /*sock=*/nullptr, + /*addrIn=*/addr, + /*nKeyedNetGroupIn=*/0, + /*nLocalHostNonceIn=*/0, + /*addrBindIn=*/CService{}, + /*addrNameIn=*/"", + /*conn_type_in=*/ConnectionType::PRIVATE_BROADCAST, + /*inbound_onion=*/false, + /*network_key=*/0}; + + auto& connman = static_cast(*m_node.connman); + connman.Handshake(node, + /*successfully_connected=*/false, + /*remote_services=*/NODE_NETWORK, + /*local_services=*/NODE_NONE, + /*version=*/PROTOCOL_VERSION, + /*relay_txs=*/true); + + BOOST_CHECK_EQUAL(m_node.addrman->Select().first.nServices, NODE_NONE); + m_node.peerman->FinalizeNode(node); +} + BOOST_AUTO_TEST_SUITE_END()