@@ -63,17 +63,28 @@ FUZZ_TARGET(banman, .init = initialize_banman)
6363 // The complexity is O(N^2), where N is the input size, because each call
6464 // might call DumpBanlist (or other methods that are at least linear
6565 // complexity of the input size).
66+ bool contains_invalid{false };
6667 LIMITED_WHILE (fuzzed_data_provider.ConsumeBool (), 300 )
6768 {
6869 CallOneOf (
6970 fuzzed_data_provider,
7071 [&] {
71- ban_man.Ban (ConsumeNetAddr (fuzzed_data_provider),
72- ConsumeBanTimeOffset (fuzzed_data_provider), fuzzed_data_provider.ConsumeBool ());
72+ CNetAddr net_addr{ConsumeNetAddr (fuzzed_data_provider)};
73+ const std::optional<CNetAddr>& addr{LookupHost (net_addr.ToStringAddr (), /* fAllowLookup=*/ false )};
74+ if (addr.has_value () && addr->IsValid ()) {
75+ net_addr = *addr;
76+ } else {
77+ contains_invalid = true ;
78+ }
79+ ban_man.Ban (net_addr, ConsumeBanTimeOffset (fuzzed_data_provider), fuzzed_data_provider.ConsumeBool ());
7380 },
7481 [&] {
75- ban_man.Ban (ConsumeSubNet (fuzzed_data_provider),
76- ConsumeBanTimeOffset (fuzzed_data_provider), fuzzed_data_provider.ConsumeBool ());
82+ CSubNet subnet{ConsumeSubNet (fuzzed_data_provider)};
83+ subnet = LookupSubNet (subnet.ToString ());
84+ if (!subnet.IsValid ()) {
85+ contains_invalid = true ;
86+ }
87+ ban_man.Ban (subnet, ConsumeBanTimeOffset (fuzzed_data_provider), fuzzed_data_provider.ConsumeBool ());
7788 },
7889 [&] {
7990 ban_man.ClearBanned ();
@@ -109,7 +120,9 @@ FUZZ_TARGET(banman, .init = initialize_banman)
109120 BanMan ban_man_read{banlist_file, /* client_interface=*/ nullptr , /* default_ban_time=*/ 0 };
110121 banmap_t banmap_read;
111122 ban_man_read.GetBanned (banmap_read);
112- assert (banmap == banmap_read);
123+ if (!contains_invalid) {
124+ assert (banmap == banmap_read);
125+ }
113126 }
114127 }
115128 fs::remove (fs::PathToString (banlist_file + " .json" ));
0 commit comments