Merge #20425: fuzz: Make CAddrMan fuzzing harness deterministic

17a5f172fa fuzz: Make addrman fuzzing harness deterministic (practicalswift)

Pull request description:

  Make `CAddrMan` fuzzing harness deterministic.

  See [`doc/fuzzing.md`](https://github.com/bitcoin/bitcoin/blob/master/doc/fuzzing.md) for information on how to fuzz Bitcoin Core. Don't forget to contribute any coverage increasing inputs you find to the [Bitcoin Core fuzzing corpus repo](https://github.com/bitcoin-core/qa-assets).

  Happy fuzzing :)

ACKs for top commit:
  Crypt-iQ:
    utACK 17a5f172fa

Tree-SHA512: 725f983745233e9b616782247fa18847e483c074ca4336a5beea8a9009128c3a74b4d50a12662d8ca2177c2e1fc5fc121834df6b459ac0af43c931d77ef7c4d8
pull/679/head
MarcoFalke 4 years ago
commit dfd0b70088
No known key found for this signature in database
GPG Key ID: D2EA4850E7528B25

@ -22,12 +22,22 @@ void initialize()
SelectParams(CBaseChainParams::REGTEST); SelectParams(CBaseChainParams::REGTEST);
} }
class CAddrManDeterministic : public CAddrMan
{
public:
void MakeDeterministic(const uint256& random_seed)
{
insecure_rand = FastRandomContext{random_seed};
Clear();
}
};
void test_one_input(const std::vector<uint8_t>& buffer) void test_one_input(const std::vector<uint8_t>& buffer)
{ {
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size()); FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
SetMockTime(ConsumeTime(fuzzed_data_provider)); SetMockTime(ConsumeTime(fuzzed_data_provider));
CAddrMan addr_man; CAddrManDeterministic addr_man;
addr_man.MakeDeterministic(ConsumeUInt256(fuzzed_data_provider));
if (fuzzed_data_provider.ConsumeBool()) { if (fuzzed_data_provider.ConsumeBool()) {
addr_man.m_asmap = ConsumeRandomLengthBitVector(fuzzed_data_provider); addr_man.m_asmap = ConsumeRandomLengthBitVector(fuzzed_data_provider);
if (!SanityCheckASMap(addr_man.m_asmap)) { if (!SanityCheckASMap(addr_man.m_asmap)) {

@ -98,7 +98,8 @@ template <typename T>
[[nodiscard]] inline int64_t ConsumeTime(FuzzedDataProvider& fuzzed_data_provider) noexcept [[nodiscard]] inline int64_t ConsumeTime(FuzzedDataProvider& fuzzed_data_provider) noexcept
{ {
static const int64_t time_min = ParseISO8601DateTime("1970-01-01T00:00:00Z"); // Avoid t=0 (1970-01-01T00:00:00Z) since SetMockTime(0) is a no-op.
static const int64_t time_min = ParseISO8601DateTime("1970-01-01T00:00:01Z");
static const int64_t time_max = ParseISO8601DateTime("9999-12-31T23:59:59Z"); static const int64_t time_max = ParseISO8601DateTime("9999-12-31T23:59:59Z");
return fuzzed_data_provider.ConsumeIntegralInRange<int64_t>(time_min, time_max); return fuzzed_data_provider.ConsumeIntegralInRange<int64_t>(time_min, time_max);
} }

Loading…
Cancel
Save