Skip to content

Commit fab9986

Browse files
author
MarcoFalke
committed
fuzz: Improve ConsumeTxDestination
* Assert when a type is missing * Add missing WitnessV1Taproot * Limit WitnessUnknown to version [2, 16], to avoid abiguity * Limit WitnessUnknown to size [2, 40], to avoid invalid sizes
1 parent fa40c09 commit fab9986

File tree

2 files changed

+14
-5
lines changed

2 files changed

+14
-5
lines changed

src/test/fuzz/util.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Distributed under the MIT software license, see the accompanying
33
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
44

5+
#include <pubkey.h>
56
#include <test/fuzz/util.h>
67
#include <test/util/script.h>
78
#include <util/rbf.h>
@@ -308,7 +309,7 @@ uint32_t ConsumeSequence(FuzzedDataProvider& fuzzed_data_provider) noexcept
308309
CTxDestination ConsumeTxDestination(FuzzedDataProvider& fuzzed_data_provider) noexcept
309310
{
310311
CTxDestination tx_destination;
311-
CallOneOf(
312+
const size_t call_size{CallOneOf(
312313
fuzzed_data_provider,
313314
[&] {
314315
tx_destination = CNoDestination{};
@@ -325,13 +326,20 @@ CTxDestination ConsumeTxDestination(FuzzedDataProvider& fuzzed_data_provider) no
325326
[&] {
326327
tx_destination = WitnessV0KeyHash{ConsumeUInt160(fuzzed_data_provider)};
327328
},
329+
[&] {
330+
tx_destination = WitnessV1Taproot{XOnlyPubKey{ConsumeUInt256(fuzzed_data_provider)}};
331+
},
328332
[&] {
329333
WitnessUnknown witness_unknown{};
330-
witness_unknown.version = fuzzed_data_provider.ConsumeIntegral<uint32_t>();
331-
const std::vector<uint8_t> witness_unknown_program_1 = fuzzed_data_provider.ConsumeBytes<uint8_t>(40);
334+
witness_unknown.version = fuzzed_data_provider.ConsumeIntegralInRange(2, 16);
335+
std::vector<uint8_t> witness_unknown_program_1{fuzzed_data_provider.ConsumeBytes<uint8_t>(40)};
336+
if (witness_unknown_program_1.size() < 2) {
337+
witness_unknown_program_1 = {0, 0};
338+
}
332339
witness_unknown.length = witness_unknown_program_1.size();
333340
std::copy(witness_unknown_program_1.begin(), witness_unknown_program_1.end(), witness_unknown.program);
334341
tx_destination = witness_unknown;
335-
});
342+
})};
343+
Assert(call_size == std::variant_size_v<CTxDestination>);
336344
return tx_destination;
337345
}

src/test/fuzz/util.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,15 @@
3737
#include <vector>
3838

3939
template <typename... Callables>
40-
void CallOneOf(FuzzedDataProvider& fuzzed_data_provider, Callables... callables)
40+
size_t CallOneOf(FuzzedDataProvider& fuzzed_data_provider, Callables... callables)
4141
{
4242
constexpr size_t call_size{sizeof...(callables)};
4343
static_assert(call_size >= 1);
4444
const size_t call_index{fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, call_size - 1)};
4545

4646
size_t i{0};
4747
((i++ == call_index ? callables() : void()), ...);
48+
return call_size;
4849
}
4950

5051
template <typename Collection>

0 commit comments

Comments
 (0)