Skip to content

Commit f572f2b

Browse files
committed
[addrman] Set m_asmap in CAddrMan initializer list
This allows us to make it const.
1 parent 5932478 commit f572f2b

File tree

10 files changed

+38
-36
lines changed

10 files changed

+38
-36
lines changed

src/addrman.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,9 @@ double CAddrInfo::GetChance(int64_t nNow) const
7777
return fChance;
7878
}
7979

80-
CAddrMan::CAddrMan(bool deterministic, int32_t consistency_check_ratio)
81-
: insecure_rand{deterministic}
80+
CAddrMan::CAddrMan(std::vector<bool> asmap, bool deterministic, int32_t consistency_check_ratio)
81+
: m_asmap{std::move(asmap)}
82+
, insecure_rand{deterministic}
8283
, nKey{deterministic ? uint256{1} : insecure_rand.rand256()}
8384
, m_consistency_check_ratio{consistency_check_ratio}
8485
{

src/addrman.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ class CAddrMan
195195
//
196196
// If a new asmap was provided, the existing records
197197
// would be re-bucketed accordingly.
198-
std::vector<bool> m_asmap;
198+
const std::vector<bool> m_asmap;
199199

200200
// Read asmap from provided binary file
201201
static std::vector<bool> DecodeAsmap(fs::path path);
@@ -471,7 +471,7 @@ class CAddrMan
471471
Check();
472472
}
473473

474-
explicit CAddrMan(bool deterministic, int32_t consistency_check_ratio);
474+
explicit CAddrMan(std::vector<bool> asmap, bool deterministic, int32_t consistency_check_ratio);
475475

476476
~CAddrMan()
477477
{

src/bench/addrman.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,14 +73,14 @@ static void AddrManAdd(benchmark::Bench& bench)
7373
CreateAddresses();
7474

7575
bench.run([&] {
76-
CAddrMan addrman{/* deterministic */ false, /* consistency_check_ratio */ 0};
76+
CAddrMan addrman{/* asmap */ std::vector<bool>(), /* deterministic */ false, /* consistency_check_ratio */ 0};
7777
AddAddressesToAddrMan(addrman);
7878
});
7979
}
8080

8181
static void AddrManSelect(benchmark::Bench& bench)
8282
{
83-
CAddrMan addrman(/* deterministic */ false, /* consistency_check_ratio */ 0);
83+
CAddrMan addrman(/* asmap */ std::vector<bool>(), /* deterministic */ false, /* consistency_check_ratio */ 0);
8484

8585
FillAddrMan(addrman);
8686

@@ -92,7 +92,7 @@ static void AddrManSelect(benchmark::Bench& bench)
9292

9393
static void AddrManGetAddr(benchmark::Bench& bench)
9494
{
95-
CAddrMan addrman(/* deterministic */ false, /* consistency_check_ratio */ 0);
95+
CAddrMan addrman(/* asmap */ std::vector<bool>(), /* deterministic */ false, /* consistency_check_ratio */ 0);
9696

9797
FillAddrMan(addrman);
9898

@@ -114,7 +114,7 @@ static void AddrManGood(benchmark::Bench& bench)
114114

115115
std::vector<std::unique_ptr<CAddrMan>> addrmans(addrman_count);
116116
for (size_t i{0}; i < addrman_count; ++i) {
117-
addrmans[i] = std::make_unique<CAddrMan>(/* deterministic */ false, /* consistency_check_ratio */ 0);
117+
addrmans[i] = std::make_unique<CAddrMan>(/* asmap */ std::vector<bool>(), /* deterministic */ false, /* consistency_check_ratio */ 0);
118118
FillAddrMan(*addrmans[i]);
119119
}
120120

src/init.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1201,8 +1201,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
12011201
}
12021202

12031203
auto check_addrman = std::clamp<int32_t>(args.GetArg("-checkaddrman", DEFAULT_ADDRMAN_CONSISTENCY_CHECKS), 0, 1000000);
1204-
node.addrman = std::make_unique<CAddrMan>(/* deterministic */ false, /* consistency_check_ratio */ check_addrman);
1205-
node.addrman->m_asmap = asmap;
1204+
node.addrman = std::make_unique<CAddrMan>(asmap, /* deterministic */ false, /* consistency_check_ratio */ check_addrman);
12061205

12071206
// Load addresses from peers.dat
12081207
uiInterface.InitMessage(_("Loading P2P addresses…").translated);
@@ -1212,8 +1211,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
12121211
LogPrintf("Loaded %i addresses from peers.dat %dms\n", node.addrman->size(), GetTimeMillis() - nStart);
12131212
} else {
12141213
// Addrman can be in an inconsistent state after failure, reset it
1215-
node.addrman = std::make_unique<CAddrMan>(/* deterministic */ false, /* consistency_check_ratio */ check_addrman);
1216-
node.addrman->m_asmap = asmap;
1214+
node.addrman = std::make_unique<CAddrMan>(asmap, /* deterministic */ false, /* consistency_check_ratio */ check_addrman);
12171215
LogPrintf("Recreating peers.dat\n");
12181216
adb.Write(*node.addrman);
12191217
}

src/test/addrman_tests.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class CAddrManSerializationMock : public CAddrMan
2626
virtual void Serialize(CDataStream& s) const = 0;
2727

2828
CAddrManSerializationMock()
29-
: CAddrMan(/* deterministic */ true, /* consistency_check_ratio */ 100)
29+
: CAddrMan(/* asmap */ std::vector<bool>(), /* deterministic */ true, /* consistency_check_ratio */ 100)
3030
{}
3131
};
3232

@@ -82,10 +82,9 @@ class CAddrManTest : public CAddrMan
8282
public:
8383
explicit CAddrManTest(bool makeDeterministic = true,
8484
std::vector<bool> asmap = std::vector<bool>())
85-
: CAddrMan(makeDeterministic, /* consistency_check_ratio */ 100)
85+
: CAddrMan(asmap, makeDeterministic, /* consistency_check_ratio */ 100)
8686
{
8787
deterministic = makeDeterministic;
88-
m_asmap = asmap;
8988
}
9089

9190
CAddrInfo* Find(const CNetAddr& addr, int* pnId = nullptr)
@@ -1024,7 +1023,7 @@ BOOST_AUTO_TEST_CASE(caddrdb_read)
10241023
// Test that the de-serialization does not throw an exception.
10251024
CDataStream ssPeers1 = AddrmanToStream(addrmanUncorrupted);
10261025
bool exceptionThrown = false;
1027-
CAddrMan addrman1(/* deterministic */ false, /* consistency_check_ratio */ 100);
1026+
CAddrMan addrman1(/* asmap */ std::vector<bool>(), /* deterministic */ false, /* consistency_check_ratio */ 100);
10281027

10291028
BOOST_CHECK(addrman1.size() == 0);
10301029
try {
@@ -1041,7 +1040,7 @@ BOOST_AUTO_TEST_CASE(caddrdb_read)
10411040
// Test that CAddrDB::Read creates an addrman with the correct number of addrs.
10421041
CDataStream ssPeers2 = AddrmanToStream(addrmanUncorrupted);
10431042

1044-
CAddrMan addrman2(/* deterministic */ false, /* consistency_check_ratio */ 100);
1043+
CAddrMan addrman2(/* asmap */ std::vector<bool>(), /* deterministic */ false, /* consistency_check_ratio */ 100);
10451044
BOOST_CHECK(addrman2.size() == 0);
10461045
BOOST_CHECK(CAddrDB::Read(addrman2, ssPeers2));
10471046
BOOST_CHECK(addrman2.size() == 3);
@@ -1055,7 +1054,7 @@ BOOST_AUTO_TEST_CASE(caddrdb_read_corrupted)
10551054
// Test that the de-serialization of corrupted addrman throws an exception.
10561055
CDataStream ssPeers1 = AddrmanToStream(addrmanCorrupted);
10571056
bool exceptionThrown = false;
1058-
CAddrMan addrman1(/* deterministic */ false, /* consistency_check_ratio */ 100);
1057+
CAddrMan addrman1(/* asmap */ std::vector<bool>(), /* deterministic */ false, /* consistency_check_ratio */ 100);
10591058
BOOST_CHECK(addrman1.size() == 0);
10601059
try {
10611060
unsigned char pchMsgTmp[4];
@@ -1071,7 +1070,7 @@ BOOST_AUTO_TEST_CASE(caddrdb_read_corrupted)
10711070
// Test that CAddrDB::Read fails if peers.dat is corrupt
10721071
CDataStream ssPeers2 = AddrmanToStream(addrmanCorrupted);
10731072

1074-
CAddrMan addrman2(/* deterministic */ false, /* consistency_check_ratio */ 100);
1073+
CAddrMan addrman2(/* asmap */ std::vector<bool>(), /* deterministic */ false, /* consistency_check_ratio */ 100);
10751074
BOOST_CHECK(addrman2.size() == 0);
10761075
BOOST_CHECK(!CAddrDB::Read(addrman2, ssPeers2));
10771076
}

src/test/fuzz/addrman.cpp

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,11 @@ class CAddrManDeterministic : public CAddrMan
2828
public:
2929
FuzzedDataProvider& m_fuzzed_data_provider;
3030

31-
explicit CAddrManDeterministic(FuzzedDataProvider& fuzzed_data_provider)
32-
: CAddrMan(/* deterministic */ true, /* consistency_check_ratio */ 0)
31+
explicit CAddrManDeterministic(std::vector<bool> asmap, FuzzedDataProvider& fuzzed_data_provider)
32+
: CAddrMan(std::move(asmap), /* deterministic */ true, /* consistency_check_ratio */ 0)
3333
, m_fuzzed_data_provider(fuzzed_data_provider)
3434
{
3535
WITH_LOCK(cs, insecure_rand = FastRandomContext{ConsumeUInt256(fuzzed_data_provider)});
36-
if (fuzzed_data_provider.ConsumeBool()) {
37-
m_asmap = ConsumeRandomLengthBitVector(fuzzed_data_provider);
38-
if (!SanityCheckASMap(m_asmap)) {
39-
m_asmap.clear();
40-
}
41-
}
4236
}
4337

4438
/**
@@ -228,7 +222,14 @@ FUZZ_TARGET_INIT(addrman, initialize_addrman)
228222
{
229223
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
230224
SetMockTime(ConsumeTime(fuzzed_data_provider));
231-
auto addr_man_ptr = std::make_unique<CAddrManDeterministic>(fuzzed_data_provider);
225+
std::vector<bool> asmap;
226+
if (fuzzed_data_provider.ConsumeBool()) {
227+
asmap = ConsumeRandomLengthBitVector(fuzzed_data_provider);
228+
if (!SanityCheckASMap(asmap)) {
229+
asmap.clear();
230+
}
231+
}
232+
auto addr_man_ptr = std::make_unique<CAddrManDeterministic>(asmap, fuzzed_data_provider);
232233
if (fuzzed_data_provider.ConsumeBool()) {
233234
const std::vector<uint8_t> serialized_data{ConsumeRandomLengthByteVector(fuzzed_data_provider)};
234235
CDataStream ds(serialized_data, SER_DISK, INIT_PROTO_VERSION);
@@ -237,7 +238,7 @@ FUZZ_TARGET_INIT(addrman, initialize_addrman)
237238
try {
238239
ds >> *addr_man_ptr;
239240
} catch (const std::ios_base::failure&) {
240-
addr_man_ptr = std::make_unique<CAddrManDeterministic>(fuzzed_data_provider);
241+
addr_man_ptr = std::make_unique<CAddrManDeterministic>(asmap, fuzzed_data_provider);
241242
}
242243
}
243244
CAddrManDeterministic& addr_man = *addr_man_ptr;
@@ -306,9 +307,12 @@ FUZZ_TARGET_INIT(addrman_serdeser, initialize_addrman)
306307
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
307308
SetMockTime(ConsumeTime(fuzzed_data_provider));
308309

309-
CAddrManDeterministic addr_man1{fuzzed_data_provider};
310-
CAddrManDeterministic addr_man2{fuzzed_data_provider};
311-
addr_man2.m_asmap = addr_man1.m_asmap;
310+
std::vector<bool> asmap = ConsumeRandomLengthBitVector(fuzzed_data_provider);
311+
if (!SanityCheckASMap(asmap)) {
312+
asmap.clear();
313+
}
314+
CAddrManDeterministic addr_man1{asmap, fuzzed_data_provider};
315+
CAddrManDeterministic addr_man2{asmap, fuzzed_data_provider};
312316

313317
CDataStream data_stream(SER_NETWORK, PROTOCOL_VERSION);
314318

src/test/fuzz/connman.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ FUZZ_TARGET_INIT(connman, initialize_connman)
2525
{
2626
FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
2727
SetMockTime(ConsumeTime(fuzzed_data_provider));
28-
CAddrMan addrman(/* deterministic */ false, /* consistency_check_ratio */ 0);
28+
CAddrMan addrman(/* asmap */ std::vector<bool>(), /* deterministic */ false, /* consistency_check_ratio */ 0);
2929
CConnman connman{fuzzed_data_provider.ConsumeIntegral<uint64_t>(), fuzzed_data_provider.ConsumeIntegral<uint64_t>(), addrman, fuzzed_data_provider.ConsumeBool()};
3030
CNetAddr random_netaddr;
3131
CNode random_node = ConsumeNode(fuzzed_data_provider);

src/test/fuzz/data_stream.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,6 @@ FUZZ_TARGET_INIT(data_stream_addr_man, initialize_data_stream_addr_man)
2121
{
2222
FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
2323
CDataStream data_stream = ConsumeDataStream(fuzzed_data_provider);
24-
CAddrMan addr_man(/* deterministic */ false, /* consistency_check_ratio */ 0);
24+
CAddrMan addr_man(/* asmap */ std::vector<bool>(), /* deterministic */ false, /* consistency_check_ratio */ 0);
2525
CAddrDB::Read(addr_man, data_stream);
2626
}

src/test/fuzz/deserialize.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ FUZZ_TARGET_DESERIALIZE(blockmerkleroot, {
188188
BlockMerkleRoot(block, &mutated);
189189
})
190190
FUZZ_TARGET_DESERIALIZE(addrman_deserialize, {
191-
CAddrMan am(/* deterministic */ false, /* consistency_check_ratio */ 0);
191+
CAddrMan am(/* asmap */ std::vector<bool>(), /* deterministic */ false, /* consistency_check_ratio */ 0);
192192
DeserializeFromFuzzingInput(buffer, am);
193193
})
194194
FUZZ_TARGET_DESERIALIZE(blockheader_deserialize, {

src/test/util/setup_common.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ TestingSetup::TestingSetup(const std::string& chainName, const std::vector<const
193193
throw std::runtime_error(strprintf("ActivateBestChain failed. (%s)", state.ToString()));
194194
}
195195

196-
m_node.addrman = std::make_unique<CAddrMan>(/* deterministic */ false, /* consistency_check_ratio */ 0);
196+
m_node.addrman = std::make_unique<CAddrMan>(/* asmap */ std::vector<bool>(), /* deterministic */ false, /* consistency_check_ratio */ 0);
197197
m_node.banman = std::make_unique<BanMan>(m_args.GetDataDirBase() / "banlist", nullptr, DEFAULT_MISBEHAVING_BANTIME);
198198
m_node.connman = std::make_unique<CConnman>(0x1337, 0x1337, *m_node.addrman); // Deterministic randomness for tests.
199199
m_node.peerman = PeerManager::make(chainparams, *m_node.connman, *m_node.addrman,

0 commit comments

Comments
 (0)