mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-02-05 21:21:17 +00:00
724c4975622bc22cedc3f3814dfc8e66cf8371f7 [fuzz] Add ConsumeAsmap() function (John Newbery)
5840476714ffebb2599999c85a23b52ebcff6090 [addrman] Make m_asmap private (John Newbery)
f9002cb5dbd573cd9ca200de21319fa296e26055 [net] Rename the copyStats arg from m_asmap to asmap (John Newbery)
f572f2b2048994b3b50f4cfd5de19e40b1acfb22 [addrman] Set m_asmap in CAddrMan initializer list (John Newbery)
593247872decd6d483a76e96d79433247226ad14 [net] Remove CConnMan::SetAsmap() (John Newbery)
50fd77045e2f858a53486b5e02e1798c92ab946c [init] Read/decode asmap before constructing addrman (John Newbery)
Pull request description:
Commit 181a1207 introduced an initialization order bug: CAddrMan's m_asmap must be set before deserializing peers.dat.
The first commit restores the correct initialization order. The remaining commits make `CAddrMan::m_asmap` usage safer:
- don't reach into `CAddrMan`'s internal data from `CConnMan`
- set `m_asmap` in the initializer list and make it const
- make `m_asmap` private, and access it (as a reference to const) from a getter.
This ensures that peers.dat deserialization must happen after setting m_asmap, since m_asmap is set during CAddrMan construction.
ACKs for top commit:
mzumsande:
Tested ACK 724c4975622bc22cedc3f3814dfc8e66cf8371f7
amitiuttarwar:
code review but utACK 724c497562
naumenkogs:
utACK 724c4975622bc22cedc3f3814dfc8e66cf8371f7
vasild:
ACK 724c4975622bc22cedc3f3814dfc8e66cf8371f7
MarcoFalke:
review ACK 724c4975622bc22cedc3f3814dfc8e66cf8371f7 👫
Tree-SHA512: 684a4cf9e3d4496c9997fb2bc4ec874809987055c157ec3fad1d2143b8223df52b5a0af787d028930b27388c8efeba0aeb2446cb35c337a5552ae76112ade726
93 lines
3.0 KiB
C++
93 lines
3.0 KiB
C++
// Copyright (c) 2020-2021 The Bitcoin Core developers
|
|
// Distributed under the MIT software license, see the accompanying
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
#include <chainparams.h>
|
|
#include <chainparamsbase.h>
|
|
#include <net.h>
|
|
#include <net_permissions.h>
|
|
#include <netaddress.h>
|
|
#include <protocol.h>
|
|
#include <random.h>
|
|
#include <test/fuzz/FuzzedDataProvider.h>
|
|
#include <test/fuzz/fuzz.h>
|
|
#include <test/fuzz/util.h>
|
|
#include <test/util/net.h>
|
|
#include <test/util/setup_common.h>
|
|
|
|
#include <cstdint>
|
|
#include <optional>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
void initialize_net()
|
|
{
|
|
static const auto testing_setup = MakeNoLogFileContext<>(CBaseChainParams::MAIN);
|
|
}
|
|
|
|
FUZZ_TARGET_INIT(net, initialize_net)
|
|
{
|
|
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
|
|
SetMockTime(ConsumeTime(fuzzed_data_provider));
|
|
CNode node{ConsumeNode(fuzzed_data_provider)};
|
|
node.SetCommonVersion(fuzzed_data_provider.ConsumeIntegral<int>());
|
|
while (fuzzed_data_provider.ConsumeBool()) {
|
|
CallOneOf(
|
|
fuzzed_data_provider,
|
|
[&] {
|
|
node.CloseSocketDisconnect();
|
|
},
|
|
[&] {
|
|
const std::vector<bool> asmap = ConsumeRandomLengthBitVector(fuzzed_data_provider);
|
|
if (!SanityCheckASMap(asmap)) {
|
|
return;
|
|
}
|
|
CNodeStats stats;
|
|
node.CopyStats(stats, asmap);
|
|
},
|
|
[&] {
|
|
const CNode* add_ref_node = node.AddRef();
|
|
assert(add_ref_node == &node);
|
|
},
|
|
[&] {
|
|
if (node.GetRefCount() > 0) {
|
|
node.Release();
|
|
}
|
|
},
|
|
[&] {
|
|
const std::optional<CInv> inv_opt = ConsumeDeserializable<CInv>(fuzzed_data_provider);
|
|
if (!inv_opt) {
|
|
return;
|
|
}
|
|
node.AddKnownTx(inv_opt->hash);
|
|
},
|
|
[&] {
|
|
node.PushTxInventory(ConsumeUInt256(fuzzed_data_provider));
|
|
},
|
|
[&] {
|
|
const std::optional<CService> service_opt = ConsumeDeserializable<CService>(fuzzed_data_provider);
|
|
if (!service_opt) {
|
|
return;
|
|
}
|
|
node.SetAddrLocal(*service_opt);
|
|
},
|
|
[&] {
|
|
const std::vector<uint8_t> b = ConsumeRandomLengthByteVector(fuzzed_data_provider);
|
|
bool complete;
|
|
node.ReceiveMsgBytes(b, complete);
|
|
});
|
|
}
|
|
|
|
(void)node.GetAddrLocal();
|
|
(void)node.GetId();
|
|
(void)node.GetLocalNonce();
|
|
(void)node.GetLocalServices();
|
|
const int ref_count = node.GetRefCount();
|
|
assert(ref_count >= 0);
|
|
(void)node.GetCommonVersion();
|
|
|
|
const NetPermissionFlags net_permission_flags = ConsumeWeakEnum(fuzzed_data_provider, ALL_NET_PERMISSION_FLAGS);
|
|
(void)node.HasPermission(net_permission_flags);
|
|
(void)node.ConnectedThroughNetwork();
|
|
}
|