Skip to content

Commit 52848dd

Browse files
committed
Test out simple generic fuzzing using traversal
1 parent ad4e299 commit 52848dd

File tree

5 files changed

+67
-0
lines changed

5 files changed

+67
-0
lines changed

fuzz/Cargo.toml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,3 +67,21 @@ name = "fuzz_sparse_bit_set_encode"
6767
path = "fuzz_targets/fuzz_sparse_bit_set_encode.rs"
6868
test = false
6969
doc = false
70+
71+
[[bin]]
72+
name = "fuzz_gdef"
73+
path = "fuzz_targets/fuzz_gdef.rs"
74+
test = false
75+
doc = false
76+
77+
[[bin]]
78+
name = "fuzz_gpos"
79+
path = "fuzz_targets/fuzz_gpos.rs"
80+
test = false
81+
doc = false
82+
83+
[[bin]]
84+
name = "fuzz_gsub"
85+
path = "fuzz_targets/fuzz_gsub.rs"
86+
test = false
87+
doc = false

fuzz/fuzz_targets/fuzz_gdef.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#![no_main]
2+
3+
mod traversal_fuzz;
4+
use libfuzzer_sys::{fuzz_target, Corpus};
5+
use read_fonts::tables::gdef::Gdef;
6+
7+
fuzz_target!(|data: &[u8]| -> Corpus { traversal_fuzz::try_traverse_table::<Gdef>(data, false) });

fuzz/fuzz_targets/fuzz_gpos.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#![no_main]
2+
3+
mod traversal_fuzz;
4+
use libfuzzer_sys::{fuzz_target, Corpus};
5+
use read_fonts::tables::gpos::Gpos;
6+
7+
fuzz_target!(|data: &[u8]| -> Corpus { traversal_fuzz::try_traverse_table::<Gpos>(data, false) });

fuzz/fuzz_targets/fuzz_gsub.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#![no_main]
2+
3+
mod traversal_fuzz;
4+
use libfuzzer_sys::{fuzz_target, Corpus};
5+
use read_fonts::tables::gsub::Gsub;
6+
7+
fuzz_target!(|data: &[u8]| -> Corpus { traversal_fuzz::try_traverse_table::<Gsub>(data, false) });

fuzz/fuzz_targets/traversal_fuzz.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
use std::fmt::Debug;
2+
use std::io::Write;
3+
4+
use libfuzzer_sys::Corpus;
5+
use read_fonts::FontRead;
6+
7+
/// Reusable entry point to fuzz any table via traversal
8+
///
9+
/// To debug timeouts, set `print_output` to `true` (the output text will help
10+
/// show where you're hitting a loop)
11+
pub fn try_traverse_table<'a, T: FontRead<'a> + Debug>(
12+
data: &'a [u8],
13+
print_output: bool,
14+
) -> Corpus {
15+
match T::read(data.into()) {
16+
Err(_) => Corpus::Reject,
17+
Ok(table) => {
18+
if print_output {
19+
eprintln!("{table:?}");
20+
} else {
21+
// if we don't want to see the output don't bother filling a buffer
22+
let mut empty = std::io::empty();
23+
write!(&mut empty, "{table:?}").unwrap();
24+
}
25+
Corpus::Keep
26+
}
27+
}
28+
}

0 commit comments

Comments
 (0)