|
16 | 16 | void test_one_input(const std::vector<uint8_t>& buffer)
|
17 | 17 | {
|
18 | 18 | FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
|
19 |
| - std::optional<CPartialMerkleTree> partial_merkle_tree = ConsumeDeserializable<CPartialMerkleTree>(fuzzed_data_provider); |
20 |
| - if (!partial_merkle_tree) { |
21 |
| - return; |
| 19 | + CPartialMerkleTree partial_merkle_tree; |
| 20 | + switch (fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 1)) { |
| 21 | + case 0: { |
| 22 | + const std::optional<CPartialMerkleTree> opt_partial_merkle_tree = ConsumeDeserializable<CPartialMerkleTree>(fuzzed_data_provider); |
| 23 | + if (opt_partial_merkle_tree) { |
| 24 | + partial_merkle_tree = *opt_partial_merkle_tree; |
| 25 | + } |
| 26 | + break; |
22 | 27 | }
|
23 |
| - (void)partial_merkle_tree->GetNumTransactions(); |
| 28 | + case 1: { |
| 29 | + CMerkleBlock merkle_block; |
| 30 | + const std::optional<CBlock> opt_block = ConsumeDeserializable<CBlock>(fuzzed_data_provider); |
| 31 | + CBloomFilter bloom_filter; |
| 32 | + std::set<uint256> txids; |
| 33 | + if (opt_block && !opt_block->vtx.empty()) { |
| 34 | + if (fuzzed_data_provider.ConsumeBool()) { |
| 35 | + merkle_block = CMerkleBlock{*opt_block, bloom_filter}; |
| 36 | + } else if (fuzzed_data_provider.ConsumeBool()) { |
| 37 | + while (fuzzed_data_provider.ConsumeBool()) { |
| 38 | + txids.insert(ConsumeUInt256(fuzzed_data_provider)); |
| 39 | + } |
| 40 | + merkle_block = CMerkleBlock{*opt_block, txids}; |
| 41 | + } |
| 42 | + } |
| 43 | + partial_merkle_tree = merkle_block.txn; |
| 44 | + break; |
| 45 | + } |
| 46 | + } |
| 47 | + (void)partial_merkle_tree.GetNumTransactions(); |
24 | 48 | std::vector<uint256> matches;
|
25 | 49 | std::vector<unsigned int> indices;
|
26 |
| - (void)partial_merkle_tree->ExtractMatches(matches, indices); |
| 50 | + (void)partial_merkle_tree.ExtractMatches(matches, indices); |
27 | 51 | }
|
0 commit comments