From 50da7432ec1e5431b243aa30f8a9339f8e8ed97d Mon Sep 17 00:00:00 2001 From: Vasil Dimov Date: Thu, 15 Apr 2021 10:40:45 +0200 Subject: [PATCH] fuzz: add CConnman::OpenNetworkConnection() to the tests Now that all network calls done by `CConnman::OpenNetworkConnection()` are done via `Sock` they can be redirected (mocked) to `FuzzedSocket` for testing. --- src/test/fuzz/connman.cpp | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/test/fuzz/connman.cpp b/src/test/fuzz/connman.cpp index 8513f07fead..e65cf5ce58b 100644 --- a/src/test/fuzz/connman.cpp +++ b/src/test/fuzz/connman.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -52,6 +53,19 @@ FUZZ_TARGET(connman, .init = initialize_connman) } AddrManDeterministic& addr_man{*addr_man_ptr}; auto net_events{ConsumeNetEvents(fuzzed_data_provider)}; + + // Mock CreateSock() to create FuzzedSock. + auto CreateSockOrig = CreateSock; + CreateSock = [&fuzzed_data_provider](int, int, int) { + return std::make_unique(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{ConsumeNetAddr(fuzzed_data_provider)}; + }; + ConnmanTestMsg connman{fuzzed_data_provider.ConsumeIntegral(), fuzzed_data_provider.ConsumeIntegral(), addr_man, @@ -66,6 +80,7 @@ FUZZ_TARGET(connman, .init = initialize_connman) connman.Init(options); CNetAddr random_netaddr; + CAddress random_address; CNode random_node = ConsumeNode(fuzzed_data_provider); CSubNet random_subnet; std::string random_string; @@ -81,6 +96,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); }, @@ -145,6 +163,21 @@ 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=*/{}, + /*strDest=*/fuzzed_data_provider.ConsumeBool() ? nullptr : random_string.c_str(), + /*conn_type=*/conn_type, + /*use_v2transport=*/fuzzed_data_provider.ConsumeBool()); }); } (void)connman.GetAddedNodeInfo(fuzzed_data_provider.ConsumeBool()); @@ -164,4 +197,6 @@ FUZZ_TARGET(connman, .init = initialize_connman) (void)connman.ASMapHealthCheck(); connman.ClearTestNodes(); + g_dns_lookup = g_dns_lookup_orig; + CreateSock = CreateSockOrig; }