Skip to content

Commit 16860fe

Browse files
committed
Merge rust-bitcoin#4185: fuzz: cover more stuff for Script
08e0d4f fuzz: cover minimal_non_dust_custom for Script (Bruno Garcia) 66fee1e fuzz: add consume_u64 (Bruno Garcia) 35e7027 fuzz: move consume_random_bytes to a util file (Bruno Garcia) eb8ecd5 fuzz: cover minimal_non_dust for Script (Bruno Garcia) cab8a61 fuzz: cover count_sigops{_legacy} for Script (Bruno Garcia) Pull request description: This PR adds fuzz coverage for `count_sigops`, `count_sigops_legacy`, `minimal_non_dust` and `minimal_non_dust_custom`. In order to not duplicate `consume_random_bytes`, it moves it to a util file and adds a `consume_u64` function to be used in the `deserialize_script` target to fuzz `minimal_non_dust_custom`. ACKs for top commit: apoelstra: ACK 08e0d4f; successfully ran local tests Tree-SHA512: d9b0b94af3e2c1b06b790e0b7d13095493d372f8c22babb9139f25f45ff580020a04c00bdba023bf4f89e2db1e13ffdff8e43f073516e7699c2ccc0233b0eb4b
2 parents 69d042c + 08e0d4f commit 16860fe

File tree

3 files changed

+49
-13
lines changed

3 files changed

+49
-13
lines changed

fuzz/fuzz_targets/bitcoin/deserialize_psbt.rs

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,7 @@
11
use honggfuzz::fuzz;
22

3-
fn consume_random_bytes<'a>(data: &mut &'a [u8]) -> &'a [u8] {
4-
if data.is_empty() {
5-
return &[];
6-
}
7-
8-
let length = (data[0] as usize) % (data.len() + 1);
9-
let (bytes, rest) = data.split_at(length);
10-
*data = rest;
11-
12-
bytes
13-
}
3+
mod fuzz_utils;
4+
use fuzz_utils::consume_random_bytes;
145

156
fn do_test(data: &[u8]) {
167
let mut new_data = data;

fuzz/fuzz_targets/bitcoin/deserialize_script.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,27 @@
11
use bitcoin::address::Address;
22
use bitcoin::consensus::encode;
33
use bitcoin::script::{self, ScriptExt as _};
4-
use bitcoin::Network;
4+
use bitcoin::{FeeRate, Network};
55
use honggfuzz::fuzz;
66

7+
mod fuzz_utils;
8+
use fuzz_utils::{consume_random_bytes, consume_u64};
9+
710
fn do_test(data: &[u8]) {
8-
let s: Result<script::ScriptBuf, _> = encode::deserialize(data);
11+
let mut new_data = data;
12+
let bytes = consume_random_bytes(&mut new_data);
13+
let s: Result<script::ScriptBuf, _> = encode::deserialize(bytes);
914
if let Ok(script) = s {
1015
let _: Result<Vec<script::Instruction>, script::Error> = script.instructions().collect();
1116

1217
let _ = script.to_string();
18+
let _ = script.count_sigops();
19+
let _ = script.count_sigops_legacy();
20+
let _ = script.minimal_non_dust();
21+
22+
let fee_rate = FeeRate::from_sat_per_kwu(consume_u64(&mut new_data));
23+
let _ = script.minimal_non_dust_custom(fee_rate);
24+
1325
let mut b = script::Builder::new();
1426
for ins in script.instructions_minimal() {
1527
if ins.is_err() {
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
pub fn consume_random_bytes<'a>(data: &mut &'a [u8]) -> &'a [u8] {
2+
if data.is_empty() {
3+
return &[];
4+
}
5+
6+
let length = (data[0] as usize) % (data.len() + 1);
7+
let (bytes, rest) = data.split_at(length);
8+
*data = rest;
9+
10+
bytes
11+
}
12+
13+
#[allow(dead_code)]
14+
pub fn consume_u64(data: &mut &[u8]) -> u64 {
15+
// We need at least 8 bytes to read a u64
16+
if data.len() < 8 {
17+
return 0;
18+
}
19+
20+
let (u64_bytes, rest) = data.split_at(8);
21+
*data = rest;
22+
23+
u64::from_le_bytes([
24+
u64_bytes[0],
25+
u64_bytes[1],
26+
u64_bytes[2],
27+
u64_bytes[3],
28+
u64_bytes[4],
29+
u64_bytes[5],
30+
u64_bytes[6],
31+
u64_bytes[7],
32+
])
33+
}

0 commit comments

Comments
 (0)