0
0
Fork 0
mirror of https://github.com/bitcoin/bitcoin.git synced 2025-02-08 10:31:50 -05:00

fuzz: Check banman roundtrip

This commit is contained in:
MarcoFalke 2021-06-23 13:28:30 +02:00
parent d6e0d78c31
commit fa485d06ec
No known key found for this signature in database
GPG key ID: CE2B75697E69A548

View file

@ -32,6 +32,13 @@ void initialize_banman()
static const auto testing_setup = MakeNoLogFileContext<>(); static const auto testing_setup = MakeNoLogFileContext<>();
} }
static bool operator==(const CBanEntry& lhs, const CBanEntry& rhs)
{
return lhs.nVersion == rhs.nVersion &&
lhs.nCreateTime == rhs.nCreateTime &&
lhs.nBanUntil == rhs.nBanUntil;
}
FUZZ_TARGET_INIT(banman, initialize_banman) FUZZ_TARGET_INIT(banman, initialize_banman)
{ {
// The complexity is O(N^2), where N is the input size, because each call // The complexity is O(N^2), where N is the input size, because each call
@ -43,19 +50,20 @@ FUZZ_TARGET_INIT(banman, initialize_banman)
fs::path banlist_file = gArgs.GetDataDirNet() / "fuzzed_banlist"; fs::path banlist_file = gArgs.GetDataDirNet() / "fuzzed_banlist";
const bool start_with_corrupted_banlist{fuzzed_data_provider.ConsumeBool()}; const bool start_with_corrupted_banlist{fuzzed_data_provider.ConsumeBool()};
bool force_read_and_write_to_err{false};
if (start_with_corrupted_banlist) { if (start_with_corrupted_banlist) {
const std::string sfx{fuzzed_data_provider.ConsumeBool() ? ".dat" : ".json"}; const std::string sfx{fuzzed_data_provider.ConsumeBool() ? ".dat" : ".json"};
assert(WriteBinaryFile(banlist_file.string() + sfx, assert(WriteBinaryFile(banlist_file.string() + sfx,
fuzzed_data_provider.ConsumeRandomLengthString())); fuzzed_data_provider.ConsumeRandomLengthString()));
} else { } else {
const bool force_read_and_write_to_err{fuzzed_data_provider.ConsumeBool()}; force_read_and_write_to_err = fuzzed_data_provider.ConsumeBool();
if (force_read_and_write_to_err) { if (force_read_and_write_to_err) {
banlist_file = fs::path{"path"} / "to" / "inaccessible" / "fuzzed_banlist"; banlist_file = fs::path{"path"} / "to" / "inaccessible" / "fuzzed_banlist";
} }
} }
{ {
BanMan ban_man{banlist_file, nullptr, ConsumeBanTimeOffset(fuzzed_data_provider)}; BanMan ban_man{banlist_file, /* client_interface */ nullptr, /* default_ban_time */ ConsumeBanTimeOffset(fuzzed_data_provider)};
while (--limit_max_ops >= 0 && fuzzed_data_provider.ConsumeBool()) { while (--limit_max_ops >= 0 && fuzzed_data_provider.ConsumeBool()) {
CallOneOf( CallOneOf(
fuzzed_data_provider, fuzzed_data_provider,
@ -93,6 +101,16 @@ FUZZ_TARGET_INIT(banman, initialize_banman)
ban_man.Discourage(ConsumeNetAddr(fuzzed_data_provider)); ban_man.Discourage(ConsumeNetAddr(fuzzed_data_provider));
}); });
} }
if (!force_read_and_write_to_err) {
ban_man.DumpBanlist();
SetMockTime(ConsumeTime(fuzzed_data_provider));
banmap_t banmap;
ban_man.GetBanned(banmap);
BanMan ban_man_read{banlist_file, /* client_interface */ nullptr, /* default_ban_time */ 0};
banmap_t banmap_read;
ban_man_read.GetBanned(banmap_read);
assert(banmap == banmap_read);
}
} }
fs::remove(banlist_file.string() + ".dat"); fs::remove(banlist_file.string() + ".dat");
fs::remove(banlist_file.string() + ".json"); fs::remove(banlist_file.string() + ".json");