Skip to content

Commit 99b336d

Browse files
kwvgPastaPastaPasta
authored andcommitted
merge bitcoin#22179: Torv2 removal followups
1 parent 31acbf1 commit 99b336d

File tree

5 files changed

+79
-2
lines changed

5 files changed

+79
-2
lines changed

src/addrman.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,38 @@ double CAddrInfo::GetChance(int64_t nNow) const
7373
return fChance;
7474
}
7575

76+
void CAddrMan::RemoveInvalid()
77+
{
78+
for (size_t bucket = 0; bucket < ADDRMAN_NEW_BUCKET_COUNT; ++bucket) {
79+
for (size_t i = 0; i < ADDRMAN_BUCKET_SIZE; ++i) {
80+
const auto id = vvNew[bucket][i];
81+
if (id != -1 && !mapInfo[id].IsValid()) {
82+
ClearNew(bucket, i);
83+
}
84+
}
85+
}
86+
87+
for (size_t bucket = 0; bucket < ADDRMAN_TRIED_BUCKET_COUNT; ++bucket) {
88+
for (size_t i = 0; i < ADDRMAN_BUCKET_SIZE; ++i) {
89+
const auto id = vvTried[bucket][i];
90+
if (id == -1) {
91+
continue;
92+
}
93+
const auto& addr_info = mapInfo[id];
94+
if (addr_info.IsValid()) {
95+
continue;
96+
}
97+
vvTried[bucket][i] = -1;
98+
--nTried;
99+
SwapRandom(addr_info.nRandomPos, vRandom.size() - 1);
100+
vRandom.pop_back();
101+
mapAddr.erase(addr_info);
102+
mapInfo.erase(id);
103+
m_tried_collisions.erase(id);
104+
}
105+
}
106+
}
107+
76108
CAddrInfo* CAddrMan::Find(const CService& addr, int* pnId)
77109
{
78110
CService addr2 = addr;

src/addrman.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,8 @@ class CAddrMan
454454
LogPrint(BCLog::ADDRMAN, "addrman lost %i new and %i tried addresses due to collisions\n", nLostUnk, nLost);
455455
}
456456

457+
RemoveInvalid();
458+
457459
Check();
458460
}
459461

@@ -767,6 +769,9 @@ class CAddrMan
767769
//! Get address info for address
768770
CAddrInfo GetAddressInfo_(const CService& addr) EXCLUSIVE_LOCKS_REQUIRED(cs);
769771

772+
//! Remove invalid addresses.
773+
void RemoveInvalid() EXCLUSIVE_LOCKS_REQUIRED(cs);
774+
770775
friend class CAddrManTest;
771776
};
772777

src/netaddress.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,7 @@ bool CNetAddr::IsRoutable() const
475475
return false;
476476
if (!fAllowPrivateNet && IsRFC1918())
477477
return false;
478-
return !(IsRFC2544() || IsRFC3927() || IsRFC4862() || IsRFC6598() || IsRFC5737() || (IsRFC4193() && !IsTor()) || IsRFC4843() || IsRFC7343() || IsLocal() || IsInternal());
478+
return !(IsRFC2544() || IsRFC3927() || IsRFC4862() || IsRFC6598() || IsRFC5737() || IsRFC4193() || IsRFC4843() || IsRFC7343() || IsLocal() || IsInternal());
479479
}
480480

481481
/**

src/test/addrman_tests.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -783,6 +783,46 @@ BOOST_AUTO_TEST_CASE(addrman_serialization)
783783
BOOST_CHECK(bucketAndEntry_asmap1_deser_addr1.second != bucketAndEntry_asmap1_deser_addr2.second);
784784
}
785785

786+
BOOST_AUTO_TEST_CASE(remove_invalid)
787+
{
788+
// Confirm that invalid addresses are ignored in unserialization.
789+
790+
CAddrManTest addrman;
791+
CDataStream stream(SER_NETWORK, PROTOCOL_VERSION);
792+
793+
const CAddress new1{ResolveService("5.5.5.5"), NODE_NONE};
794+
const CAddress new2{ResolveService("6.6.6.6"), NODE_NONE};
795+
const CAddress tried1{ResolveService("7.7.7.7"), NODE_NONE};
796+
const CAddress tried2{ResolveService("8.8.8.8"), NODE_NONE};
797+
798+
addrman.Add({new1, tried1, new2, tried2}, CNetAddr{});
799+
addrman.Good(tried1);
800+
addrman.Good(tried2);
801+
BOOST_REQUIRE_EQUAL(addrman.size(), 4);
802+
803+
stream << addrman;
804+
805+
const std::string str{stream.str()};
806+
size_t pos;
807+
808+
const char new2_raw[]{6, 6, 6, 6};
809+
const uint8_t new2_raw_replacement[]{0, 0, 0, 0}; // 0.0.0.0 is !IsValid()
810+
pos = str.find(new2_raw, 0, sizeof(new2_raw));
811+
BOOST_REQUIRE(pos != std::string::npos);
812+
BOOST_REQUIRE(pos + sizeof(new2_raw_replacement) <= stream.size());
813+
memcpy(stream.data() + pos, new2_raw_replacement, sizeof(new2_raw_replacement));
814+
815+
const char tried2_raw[]{8, 8, 8, 8};
816+
const uint8_t tried2_raw_replacement[]{255, 255, 255, 255}; // 255.255.255.255 is !IsValid()
817+
pos = str.find(tried2_raw, 0, sizeof(tried2_raw));
818+
BOOST_REQUIRE(pos != std::string::npos);
819+
BOOST_REQUIRE(pos + sizeof(tried2_raw_replacement) <= stream.size());
820+
memcpy(stream.data() + pos, tried2_raw_replacement, sizeof(tried2_raw_replacement));
821+
822+
addrman.Clear();
823+
stream >> addrman;
824+
BOOST_CHECK_EQUAL(addrman.size(), 2);
825+
}
786826

787827
BOOST_AUTO_TEST_CASE(addrman_selecttriedcollision)
788828
{

src/test/fuzz/netaddress.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ FUZZ_TARGET(netaddress)
5555
(void)net_addr.IsRFC3927();
5656
(void)net_addr.IsRFC3964();
5757
if (net_addr.IsRFC4193()) {
58-
assert(net_addr.GetNetwork() == Network::NET_ONION || net_addr.GetNetwork() == Network::NET_INTERNAL || net_addr.GetNetwork() == Network::NET_UNROUTABLE);
58+
assert(net_addr.GetNetwork() == Network::NET_INTERNAL || net_addr.GetNetwork() == Network::NET_UNROUTABLE);
5959
}
6060
(void)net_addr.IsRFC4380();
6161
(void)net_addr.IsRFC4843();

0 commit comments

Comments
 (0)