@@ -63,17 +63,28 @@ FUZZ_TARGET(banman, .init = initialize_banman)
63
63
// The complexity is O(N^2), where N is the input size, because each call
64
64
// might call DumpBanlist (or other methods that are at least linear
65
65
// complexity of the input size).
66
+ bool contains_invalid{false };
66
67
LIMITED_WHILE (fuzzed_data_provider.ConsumeBool (), 300 )
67
68
{
68
69
CallOneOf (
69
70
fuzzed_data_provider,
70
71
[&] {
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 ());
73
80
},
74
81
[&] {
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 ());
77
88
},
78
89
[&] {
79
90
ban_man.ClearBanned ();
@@ -109,7 +120,9 @@ FUZZ_TARGET(banman, .init = initialize_banman)
109
120
BanMan ban_man_read{banlist_file, /* client_interface=*/ nullptr , /* default_ban_time=*/ 0 };
110
121
banmap_t banmap_read;
111
122
ban_man_read.GetBanned (banmap_read);
112
- assert (banmap == banmap_read);
123
+ if (!contains_invalid) {
124
+ assert (banmap == banmap_read);
125
+ }
113
126
}
114
127
}
115
128
fs::remove (fs::PathToString (banlist_file + " .json" ));
0 commit comments