mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 20:12:57 +01:00
partial bitcoin#20789: Rework strong and weak net enum fuzzing
excludes: - faaef9434c19e3643322ee442c240c166af5adbd
This commit is contained in:
parent
49805c11a5
commit
0644b9b6db
@ -12,6 +12,7 @@
|
|||||||
#include <test/fuzz/FuzzedDataProvider.h>
|
#include <test/fuzz/FuzzedDataProvider.h>
|
||||||
#include <test/fuzz/fuzz.h>
|
#include <test/fuzz/fuzz.h>
|
||||||
#include <test/fuzz/util.h>
|
#include <test/fuzz/util.h>
|
||||||
|
#include <test/util/net.h>
|
||||||
#include <test/util/setup_common.h>
|
#include <test/util/setup_common.h>
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
@ -143,9 +144,7 @@ FUZZ_TARGET_INIT(net, initialize_net)
|
|||||||
(void)node.GetSendVersion();
|
(void)node.GetSendVersion();
|
||||||
(void)node.IsAddrRelayPeer();
|
(void)node.IsAddrRelayPeer();
|
||||||
|
|
||||||
const NetPermissionFlags net_permission_flags = fuzzed_data_provider.ConsumeBool() ?
|
const NetPermissionFlags net_permission_flags = ConsumeWeakEnum(fuzzed_data_provider, ALL_NET_PERMISSION_FLAGS);
|
||||||
fuzzed_data_provider.PickValueInArray<NetPermissionFlags>({NetPermissionFlags::PF_NONE, NetPermissionFlags::PF_BLOOMFILTER, NetPermissionFlags::PF_RELAY, NetPermissionFlags::PF_FORCERELAY, NetPermissionFlags::PF_NOBAN, NetPermissionFlags::PF_MEMPOOL, NetPermissionFlags::PF_ISIMPLICIT, NetPermissionFlags::PF_ALL}) :
|
|
||||||
static_cast<NetPermissionFlags>(fuzzed_data_provider.ConsumeIntegral<uint32_t>());
|
|
||||||
(void)node.HasPermission(net_permission_flags);
|
(void)node.HasPermission(net_permission_flags);
|
||||||
(void)node.ConnectedThroughNetwork();
|
(void)node.ConnectedThroughNetwork();
|
||||||
}
|
}
|
||||||
|
@ -17,18 +17,7 @@ FUZZ_TARGET(net_permissions)
|
|||||||
{
|
{
|
||||||
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
|
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
|
||||||
const std::string s = fuzzed_data_provider.ConsumeRandomLengthString(32);
|
const std::string s = fuzzed_data_provider.ConsumeRandomLengthString(32);
|
||||||
const NetPermissionFlags net_permission_flags = fuzzed_data_provider.ConsumeBool() ? fuzzed_data_provider.PickValueInArray<NetPermissionFlags>({
|
const NetPermissionFlags net_permission_flags = ConsumeWeakEnum(fuzzed_data_provider, ALL_NET_PERMISSION_FLAGS);
|
||||||
NetPermissionFlags::PF_NONE,
|
|
||||||
NetPermissionFlags::PF_BLOOMFILTER,
|
|
||||||
NetPermissionFlags::PF_RELAY,
|
|
||||||
NetPermissionFlags::PF_FORCERELAY,
|
|
||||||
NetPermissionFlags::PF_NOBAN,
|
|
||||||
NetPermissionFlags::PF_MEMPOOL,
|
|
||||||
NetPermissionFlags::PF_ADDR,
|
|
||||||
NetPermissionFlags::PF_ISIMPLICIT,
|
|
||||||
NetPermissionFlags::PF_ALL,
|
|
||||||
}) :
|
|
||||||
static_cast<NetPermissionFlags>(fuzzed_data_provider.ConsumeIntegral<uint32_t>());
|
|
||||||
|
|
||||||
NetWhitebindPermissions net_whitebind_permissions;
|
NetWhitebindPermissions net_whitebind_permissions;
|
||||||
bilingual_str error_net_whitebind_permissions;
|
bilingual_str error_net_whitebind_permissions;
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#include <streams.h>
|
#include <streams.h>
|
||||||
#include <test/fuzz/FuzzedDataProvider.h>
|
#include <test/fuzz/FuzzedDataProvider.h>
|
||||||
#include <test/fuzz/fuzz.h>
|
#include <test/fuzz/fuzz.h>
|
||||||
|
#include <test/fuzz/util.h>
|
||||||
#include <test/util/mining.h>
|
#include <test/util/mining.h>
|
||||||
#include <test/util/net.h>
|
#include <test/util/net.h>
|
||||||
#include <test/util/setup_common.h>
|
#include <test/util/setup_common.h>
|
||||||
@ -65,13 +66,15 @@ void fuzz_target(const std::vector<uint8_t>& buffer, const std::string& LIMIT_TO
|
|||||||
if (!LIMIT_TO_MESSAGE_TYPE.empty() && random_message_type != LIMIT_TO_MESSAGE_TYPE) {
|
if (!LIMIT_TO_MESSAGE_TYPE.empty() && random_message_type != LIMIT_TO_MESSAGE_TYPE) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
CDataStream random_bytes_data_stream{fuzzed_data_provider.ConsumeRemainingBytes<unsigned char>(), SER_NETWORK, PROTOCOL_VERSION};
|
CNode& p2p_node = *ConsumeNodeAsUniquePtr(fuzzed_data_provider).release();
|
||||||
CNode& p2p_node = *std::make_unique<CNode>(0, ServiceFlags(NODE_NETWORK | NODE_BLOOM), INVALID_SOCKET, CAddress{CService{in_addr{0x0100007f}, 7777}, NODE_NETWORK}, 0, 0, CAddress{}, std::string{}, false).release();
|
|
||||||
p2p_node.fSuccessfullyConnected = true;
|
p2p_node.fSuccessfullyConnected = true;
|
||||||
p2p_node.nVersion = PROTOCOL_VERSION;
|
p2p_node.nVersion = PROTOCOL_VERSION;
|
||||||
p2p_node.SetSendVersion(PROTOCOL_VERSION);
|
p2p_node.SetSendVersion(PROTOCOL_VERSION);
|
||||||
connman.AddTestNode(p2p_node);
|
connman.AddTestNode(p2p_node);
|
||||||
g_setup->m_node.peerman->InitializeNode(&p2p_node);
|
g_setup->m_node.peerman->InitializeNode(&p2p_node);
|
||||||
|
|
||||||
|
// fuzzed_data_provider is fully consumed after this call, don't use it
|
||||||
|
CDataStream random_bytes_data_stream{fuzzed_data_provider.ConsumeRemainingBytes<unsigned char>(), SER_NETWORK, PROTOCOL_VERSION};
|
||||||
try {
|
try {
|
||||||
g_setup->m_node.peerman->ProcessMessage(p2p_node, random_message_type, random_bytes_data_stream, GetTimeMillis(), std::atomic<bool>{false});
|
g_setup->m_node.peerman->ProcessMessage(p2p_node, random_message_type, random_bytes_data_stream, GetTimeMillis(), std::atomic<bool>{false});
|
||||||
} catch (const std::ios_base::failure& e) {
|
} catch (const std::ios_base::failure& e) {
|
||||||
|
@ -42,9 +42,7 @@ FUZZ_TARGET_INIT(process_messages, initialize_process_messages)
|
|||||||
|
|
||||||
const auto num_peers_to_add = fuzzed_data_provider.ConsumeIntegralInRange(1, 3);
|
const auto num_peers_to_add = fuzzed_data_provider.ConsumeIntegralInRange(1, 3);
|
||||||
for (int i = 0; i < num_peers_to_add; ++i) {
|
for (int i = 0; i < num_peers_to_add; ++i) {
|
||||||
const ServiceFlags service_flags = ServiceFlags(fuzzed_data_provider.ConsumeIntegral<uint64_t>());
|
peers.push_back(ConsumeNodeAsUniquePtr(fuzzed_data_provider, i).release());
|
||||||
const bool inbound{fuzzed_data_provider.ConsumeBool()};
|
|
||||||
peers.push_back(std::make_unique<CNode>(i, service_flags, INVALID_SOCKET, CAddress{CService{in_addr{0x0100007f}, 7777}, NODE_NETWORK}, 0, 0, CAddress{}, std::string{}, inbound).release());
|
|
||||||
CNode& p2p_node = *peers.back();
|
CNode& p2p_node = *peers.back();
|
||||||
|
|
||||||
p2p_node.fSuccessfullyConnected = true;
|
p2p_node.fSuccessfullyConnected = true;
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include <streams.h>
|
#include <streams.h>
|
||||||
#include <test/fuzz/FuzzedDataProvider.h>
|
#include <test/fuzz/FuzzedDataProvider.h>
|
||||||
#include <test/fuzz/fuzz.h>
|
#include <test/fuzz/fuzz.h>
|
||||||
|
#include <test/util/net.h>
|
||||||
#include <test/util/setup_common.h>
|
#include <test/util/setup_common.h>
|
||||||
#include <txmempool.h>
|
#include <txmempool.h>
|
||||||
#include <uint256.h>
|
#include <uint256.h>
|
||||||
@ -99,6 +100,14 @@ template <typename T>
|
|||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename WeakEnumType, size_t size>
|
||||||
|
[[nodiscard]] WeakEnumType ConsumeWeakEnum(FuzzedDataProvider& fuzzed_data_provider, const WeakEnumType (&all_types)[size]) noexcept
|
||||||
|
{
|
||||||
|
return fuzzed_data_provider.ConsumeBool() ?
|
||||||
|
fuzzed_data_provider.PickValueInArray<WeakEnumType>(all_types) :
|
||||||
|
WeakEnumType(fuzzed_data_provider.ConsumeIntegral<typename std::underlying_type<WeakEnumType>::type>());
|
||||||
|
}
|
||||||
|
|
||||||
[[ nodiscard ]] inline opcodetype ConsumeOpcodeType(FuzzedDataProvider& fuzzed_data_provider) noexcept
|
[[ nodiscard ]] inline opcodetype ConsumeOpcodeType(FuzzedDataProvider& fuzzed_data_provider) noexcept
|
||||||
{
|
{
|
||||||
return static_cast<opcodetype>(fuzzed_data_provider.ConsumeIntegralInRange<uint32_t>(0, MAX_OPCODE));
|
return static_cast<opcodetype>(fuzzed_data_provider.ConsumeIntegralInRange<uint32_t>(0, MAX_OPCODE));
|
||||||
@ -285,13 +294,14 @@ inline CService ConsumeService(FuzzedDataProvider& fuzzed_data_provider) noexcep
|
|||||||
|
|
||||||
inline CAddress ConsumeAddress(FuzzedDataProvider& fuzzed_data_provider) noexcept
|
inline CAddress ConsumeAddress(FuzzedDataProvider& fuzzed_data_provider) noexcept
|
||||||
{
|
{
|
||||||
return {ConsumeService(fuzzed_data_provider), static_cast<ServiceFlags>(fuzzed_data_provider.ConsumeIntegral<uint64_t>()), fuzzed_data_provider.ConsumeIntegral<uint32_t>()};
|
return {ConsumeService(fuzzed_data_provider), ConsumeWeakEnum(fuzzed_data_provider, ALL_SERVICE_FLAGS), fuzzed_data_provider.ConsumeIntegral<uint32_t>()};
|
||||||
}
|
}
|
||||||
|
|
||||||
inline CNode ConsumeNode(FuzzedDataProvider& fuzzed_data_provider) noexcept
|
template <bool ReturnUniquePtr = false>
|
||||||
|
auto ConsumeNode(FuzzedDataProvider& fuzzed_data_provider, const std::optional<NodeId>& node_id_in = std::nullopt) noexcept
|
||||||
{
|
{
|
||||||
const NodeId node_id = fuzzed_data_provider.ConsumeIntegral<NodeId>();
|
const NodeId node_id = node_id_in.value_or(fuzzed_data_provider.ConsumeIntegral<NodeId>());
|
||||||
const ServiceFlags local_services = static_cast<ServiceFlags>(fuzzed_data_provider.ConsumeIntegral<uint64_t>());
|
const ServiceFlags local_services = ConsumeWeakEnum(fuzzed_data_provider, ALL_SERVICE_FLAGS);
|
||||||
const SOCKET socket = INVALID_SOCKET;
|
const SOCKET socket = INVALID_SOCKET;
|
||||||
const CAddress address = ConsumeAddress(fuzzed_data_provider);
|
const CAddress address = ConsumeAddress(fuzzed_data_provider);
|
||||||
const uint64_t keyed_net_group = fuzzed_data_provider.ConsumeIntegral<uint64_t>();
|
const uint64_t keyed_net_group = fuzzed_data_provider.ConsumeIntegral<uint64_t>();
|
||||||
@ -300,8 +310,13 @@ inline CNode ConsumeNode(FuzzedDataProvider& fuzzed_data_provider) noexcept
|
|||||||
const std::string addr_name = fuzzed_data_provider.ConsumeRandomLengthString(64);
|
const std::string addr_name = fuzzed_data_provider.ConsumeRandomLengthString(64);
|
||||||
const bool inbound = fuzzed_data_provider.ConsumeBool();
|
const bool inbound = fuzzed_data_provider.ConsumeBool();
|
||||||
const bool block_relay_only = fuzzed_data_provider.ConsumeBool();
|
const bool block_relay_only = fuzzed_data_provider.ConsumeBool();
|
||||||
return {node_id, local_services, socket, address, keyed_net_group, local_host_nonce, addr_bind, addr_name, inbound, block_relay_only};
|
if constexpr (ReturnUniquePtr) {
|
||||||
|
return std::make_unique<CNode>(node_id, local_services, socket, address, keyed_net_group, local_host_nonce, addr_bind, addr_name, inbound, block_relay_only);
|
||||||
|
} else {
|
||||||
|
return CNode{node_id, local_services, socket, address, keyed_net_group, local_host_nonce, addr_bind, addr_name, inbound, block_relay_only};
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
inline std::unique_ptr<CNode> ConsumeNodeAsUniquePtr(FuzzedDataProvider& fdp, const std::optional<NodeId>& node_id_in = nullopt) { return ConsumeNode<true>(fdp, node_id_in); }
|
||||||
|
|
||||||
inline void InitializeFuzzingContext(const std::string& chain_name = CBaseChainParams::REGTEST)
|
inline void InitializeFuzzingContext(const std::string& chain_name = CBaseChainParams::REGTEST)
|
||||||
{
|
{
|
||||||
|
@ -30,4 +30,27 @@ struct ConnmanTestMsg : public CConnman {
|
|||||||
bool ReceiveMsgFrom(CNode& node, CSerializedNetMsg& ser_msg) const;
|
bool ReceiveMsgFrom(CNode& node, CSerializedNetMsg& ser_msg) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
constexpr ServiceFlags ALL_SERVICE_FLAGS[]{
|
||||||
|
NODE_NONE,
|
||||||
|
NODE_NETWORK,
|
||||||
|
NODE_GETUTXO,
|
||||||
|
NODE_BLOOM,
|
||||||
|
NODE_COMPACT_FILTERS,
|
||||||
|
NODE_NETWORK_LIMITED,
|
||||||
|
NODE_HEADERS_COMPRESSED,
|
||||||
|
};
|
||||||
|
|
||||||
|
constexpr NetPermissionFlags ALL_NET_PERMISSION_FLAGS[]{
|
||||||
|
NetPermissionFlags::PF_NONE,
|
||||||
|
NetPermissionFlags::PF_BLOOMFILTER,
|
||||||
|
NetPermissionFlags::PF_RELAY,
|
||||||
|
NetPermissionFlags::PF_FORCERELAY,
|
||||||
|
NetPermissionFlags::PF_NOBAN,
|
||||||
|
NetPermissionFlags::PF_MEMPOOL,
|
||||||
|
NetPermissionFlags::PF_ADDR,
|
||||||
|
NetPermissionFlags::PF_DOWNLOAD,
|
||||||
|
NetPermissionFlags::PF_ISIMPLICIT,
|
||||||
|
NetPermissionFlags::PF_ALL,
|
||||||
|
};
|
||||||
|
|
||||||
#endif // BITCOIN_TEST_UTIL_NET_H
|
#endif // BITCOIN_TEST_UTIL_NET_H
|
||||||
|
Loading…
Reference in New Issue
Block a user