Skip to content

Commit f9b2863

Browse files
committed
fuzz: call lookup functions before calling Ban
Also, compare banmaps only if there are no invalid entries.
1 parent 4458ae8 commit f9b2863

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

src/test/fuzz/banman.cpp

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)