From db74b181766790aca6993ed104b694c7f949504c Mon Sep 17 00:00:00 2001 From: fanquake Date: Wed, 8 Nov 2023 14:10:18 +0000 Subject: [PATCH 1/3] Merge bitcoin/bitcoin#28815: fuzz: Avoid timeout and bloat in fuzz targets fabb5046a7365af3079e6e45606d63576bc6ad12 fuzz: Avoid timeout and bloat in fuzz targets (MarcoFalke) Pull request description: If the fuzz input contains invalid data *in a loop*, abort early. This will teach the fuzz engine to look for useful data and avoids bloating the fuzz input folder with useless (repeated) data. ACKs for top commit: dergoegge: utACK fabb5046a7365af3079e6e45606d63576bc6ad12 brunoerg: crACK fabb5046a7365af3079e6e45606d63576bc6ad12 Tree-SHA512: 26da100d7558ae6fdd5292fb146d8858b2af8f78c546ca2509b9d27b33a33e9462ecb6035de142f9f36dd5de32f8cbad099d6c7a697902d23e1bb621cd27dc88 --- src/test/fuzz/bloom_filter.cpp | 10 ++++++--- src/test/fuzz/coins_view.cpp | 23 ++++++++++++++----- src/test/fuzz/fuzz.h | 5 +++++ src/test/fuzz/policy_estimator.cpp | 12 +++++----- src/test/fuzz/rpc.cpp | 36 +++++++++++++++++++----------- 5 files changed, 59 insertions(+), 27 deletions(-) diff --git a/src/test/fuzz/bloom_filter.cpp b/src/test/fuzz/bloom_filter.cpp index 48f471f0a7bb..aba7869df6f3 100644 --- a/src/test/fuzz/bloom_filter.cpp +++ b/src/test/fuzz/bloom_filter.cpp @@ -10,21 +10,22 @@ #include #include -#include +#include #include -#include #include FUZZ_TARGET(bloom_filter) { FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size()); + bool good_data{true}; CBloomFilter bloom_filter{ fuzzed_data_provider.ConsumeIntegralInRange(1, 10000000), 1.0 / fuzzed_data_provider.ConsumeIntegralInRange(1, std::numeric_limits::max()), fuzzed_data_provider.ConsumeIntegral(), static_cast(fuzzed_data_provider.PickValueInArray({BLOOM_UPDATE_NONE, BLOOM_UPDATE_ALL, BLOOM_UPDATE_P2PUBKEY_ONLY, BLOOM_UPDATE_MASK}))}; - LIMITED_WHILE(fuzzed_data_provider.remaining_bytes() > 0, 10000) { + LIMITED_WHILE(good_data && fuzzed_data_provider.remaining_bytes() > 0, 10'000) + { CallOneOf( fuzzed_data_provider, [&] { @@ -37,6 +38,7 @@ FUZZ_TARGET(bloom_filter) [&] { const std::optional out_point = ConsumeDeserializable(fuzzed_data_provider); if (!out_point) { + good_data = false; return; } (void)bloom_filter.contains(*out_point); @@ -47,6 +49,7 @@ FUZZ_TARGET(bloom_filter) [&] { const std::optional u256 = ConsumeDeserializable(fuzzed_data_provider); if (!u256) { + good_data = false; return; } (void)bloom_filter.contains(*u256); @@ -57,6 +60,7 @@ FUZZ_TARGET(bloom_filter) [&] { const std::optional mut_tx = ConsumeDeserializable(fuzzed_data_provider); if (!mut_tx) { + good_data = false; return; } const CTransaction tx{*mut_tx}; diff --git a/src/test/fuzz/coins_view.cpp b/src/test/fuzz/coins_view.cpp index b8f68fc76e42..5bf0eb521a5d 100644 --- a/src/test/fuzz/coins_view.cpp +++ b/src/test/fuzz/coins_view.cpp @@ -2,28 +2,30 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#include #include #include #include #include #include #include -#include #include #include -#include +#include