mirror of https://github.com/bitcoin/bitcoin
Merge 6d9083b249
into a46065e36c
This commit is contained in:
commit
423468f109
|
@ -6,6 +6,7 @@
|
|||
#include <chainparams.h>
|
||||
#include <common/args.h>
|
||||
#include <net.h>
|
||||
#include <net_processing.h>
|
||||
#include <netaddress.h>
|
||||
#include <protocol.h>
|
||||
#include <test/fuzz/FuzzedDataProvider.h>
|
||||
|
@ -32,6 +33,19 @@ FUZZ_TARGET(connman, .init = initialize_connman)
|
|||
{
|
||||
FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
|
||||
SetMockTime(ConsumeTime(fuzzed_data_provider));
|
||||
|
||||
// Mock CreateSock() to create FuzzedSock.
|
||||
auto CreateSockOrig = CreateSock;
|
||||
CreateSock = [&fuzzed_data_provider](const sa_family_t&) {
|
||||
return std::make_unique<FuzzedSock>(fuzzed_data_provider);
|
||||
};
|
||||
|
||||
// Mock g_dns_lookup() to return a fuzzed address.
|
||||
auto g_dns_lookup_orig = g_dns_lookup;
|
||||
g_dns_lookup = [&fuzzed_data_provider](const std::string&, bool) {
|
||||
return std::vector<CNetAddr>{ConsumeNetAddr(fuzzed_data_provider)};
|
||||
};
|
||||
|
||||
ConnmanTestMsg connman{fuzzed_data_provider.ConsumeIntegral<uint64_t>(),
|
||||
fuzzed_data_provider.ConsumeIntegral<uint64_t>(),
|
||||
*g_setup->m_node.addrman,
|
||||
|
@ -41,10 +55,12 @@ FUZZ_TARGET(connman, .init = initialize_connman)
|
|||
|
||||
const uint64_t max_outbound_limit{fuzzed_data_provider.ConsumeIntegral<uint64_t>()};
|
||||
CConnman::Options options;
|
||||
options.m_msgproc = g_setup->m_node.peerman.get();
|
||||
options.nMaxOutboundLimit = max_outbound_limit;
|
||||
connman.Init(options);
|
||||
|
||||
CNetAddr random_netaddr;
|
||||
CAddress random_address;
|
||||
CNode random_node = ConsumeNode(fuzzed_data_provider);
|
||||
CSubNet random_subnet;
|
||||
std::string random_string;
|
||||
|
@ -60,6 +76,9 @@ FUZZ_TARGET(connman, .init = initialize_connman)
|
|||
[&] {
|
||||
random_netaddr = ConsumeNetAddr(fuzzed_data_provider);
|
||||
},
|
||||
[&] {
|
||||
random_address = ConsumeAddress(fuzzed_data_provider);
|
||||
},
|
||||
[&] {
|
||||
random_subnet = ConsumeSubNet(fuzzed_data_provider);
|
||||
},
|
||||
|
@ -126,6 +145,52 @@ FUZZ_TARGET(connman, .init = initialize_connman)
|
|||
},
|
||||
[&] {
|
||||
connman.SetTryNewOutboundPeer(fuzzed_data_provider.ConsumeBool());
|
||||
},
|
||||
[&] {
|
||||
ConnectionType conn_type{
|
||||
fuzzed_data_provider.PickValueInArray(ALL_CONNECTION_TYPES)};
|
||||
if (conn_type == ConnectionType::INBOUND) { // INBOUND is not allowed
|
||||
conn_type = ConnectionType::OUTBOUND_FULL_RELAY;
|
||||
}
|
||||
|
||||
connman.OpenNetworkConnection(
|
||||
/*addrConnect=*/random_address,
|
||||
/*fCountFailure=*/fuzzed_data_provider.ConsumeBool(),
|
||||
/*grant_outbound=*/CSemaphoreGrant{},
|
||||
/*strDest=*/fuzzed_data_provider.ConsumeBool() ? nullptr : random_string.c_str(),
|
||||
/*conn_type=*/conn_type,
|
||||
/*use_v2transport=*/fuzzed_data_provider.ConsumeBool());
|
||||
},
|
||||
[&] {
|
||||
connman.SetNetworkActive(fuzzed_data_provider.ConsumeBool());
|
||||
const auto peer = ConsumeAddress(fuzzed_data_provider);
|
||||
connman.CreateNodeFromAcceptedSocketPublic(
|
||||
/*sock=*/CreateSock(AF_INET),
|
||||
/*permissions=*/ConsumeWeakEnum(fuzzed_data_provider, ALL_NET_PERMISSION_FLAGS),
|
||||
/*addr_bind=*/ConsumeAddress(fuzzed_data_provider),
|
||||
/*addr_peer=*/peer);
|
||||
},
|
||||
[&] {
|
||||
CConnman::Options options;
|
||||
|
||||
options.vBinds = ConsumeServiceVector(fuzzed_data_provider, 5);
|
||||
|
||||
options.vWhiteBinds = std::vector<NetWhitebindPermissions>{
|
||||
fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 5)};
|
||||
for (auto& wb : options.vWhiteBinds) {
|
||||
wb.m_flags = ConsumeWeakEnum(fuzzed_data_provider, ALL_NET_PERMISSION_FLAGS);
|
||||
wb.m_service = ConsumeService(fuzzed_data_provider);
|
||||
}
|
||||
|
||||
options.onion_binds = ConsumeServiceVector(fuzzed_data_provider, 5);
|
||||
|
||||
options.bind_on_any = options.vBinds.empty() && options.vWhiteBinds.empty() &&
|
||||
options.onion_binds.empty();
|
||||
|
||||
connman.InitBindsPublic(options);
|
||||
},
|
||||
[&] {
|
||||
connman.SocketHandlerPublic();
|
||||
});
|
||||
}
|
||||
(void)connman.GetAddedNodeInfo(fuzzed_data_provider.ConsumeBool());
|
||||
|
@ -144,4 +209,6 @@ FUZZ_TARGET(connman, .init = initialize_connman)
|
|||
(void)connman.GetUseAddrmanOutgoing();
|
||||
|
||||
connman.ClearTestNodes();
|
||||
g_dns_lookup = g_dns_lookup_orig;
|
||||
CreateSock = CreateSockOrig;
|
||||
}
|
||||
|
|
|
@ -103,6 +103,18 @@ inline CService ConsumeService(FuzzedDataProvider& fuzzed_data_provider) noexcep
|
|||
return {ConsumeNetAddr(fuzzed_data_provider), fuzzed_data_provider.ConsumeIntegral<uint16_t>()};
|
||||
}
|
||||
|
||||
inline std::vector<CService> ConsumeServiceVector(FuzzedDataProvider& fuzzed_data_provider,
|
||||
size_t max_vector_size) noexcept
|
||||
{
|
||||
std::vector<CService> ret;
|
||||
const size_t size = fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, max_vector_size);
|
||||
ret.reserve(size);
|
||||
for (size_t i = 0; i < size; ++i) {
|
||||
ret.emplace_back(ConsumeService(fuzzed_data_provider));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
CAddress ConsumeAddress(FuzzedDataProvider& fuzzed_data_provider) noexcept;
|
||||
|
||||
template <bool ReturnUniquePtr = false>
|
||||
|
|
|
@ -62,6 +62,24 @@ struct ConnmanTestMsg : public CConnman {
|
|||
m_nodes.clear();
|
||||
}
|
||||
|
||||
void CreateNodeFromAcceptedSocketPublic(std::unique_ptr<Sock> sock,
|
||||
NetPermissionFlags permissions,
|
||||
const CAddress& addr_bind,
|
||||
const CAddress& addr_peer)
|
||||
{
|
||||
CreateNodeFromAcceptedSocket(std::move(sock), permissions, addr_bind, addr_peer);
|
||||
}
|
||||
|
||||
bool InitBindsPublic(const CConnman::Options& options)
|
||||
{
|
||||
return InitBinds(options);
|
||||
}
|
||||
|
||||
void SocketHandlerPublic()
|
||||
{
|
||||
SocketHandler();
|
||||
}
|
||||
|
||||
void Handshake(CNode& node,
|
||||
bool successfully_connected,
|
||||
ServiceFlags remote_services,
|
||||
|
|
Loading…
Reference in New Issue