Skip to content

Commit 0f71709

Browse files
committed
Merge branch 'fuzz-gix-config'
2 parents 7661098 + d83b4e0 commit 0f71709

File tree

4 files changed

+103
-15
lines changed

4 files changed

+103
-15
lines changed

gix-config/fuzz/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ cargo-fuzz = true
1313
libfuzzer-sys = "0.4.7"
1414
arbitrary = { version = "1", features = ["derive"] }
1515
bstr = "1.8.0"
16+
anyhow = "1.0.76"
1617

1718
[dependencies.gix-config]
1819
path = ".."
Lines changed: 60 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,75 @@
11
#![no_main]
22

3+
use anyhow::Result;
34
use arbitrary::Arbitrary;
5+
use bstr::BStr;
46
use gix_config::{
57
file::{init::Options, Metadata},
68
File,
79
};
810
use libfuzzer_sys::fuzz_target;
11+
use std::error::Error;
12+
use std::fmt;
913
use std::hint::black_box;
1014

1115
#[derive(Arbitrary, Debug)]
1216
struct Ctx<'a> {
1317
input: &'a [u8],
1418
sections_by_name: &'a str,
19+
section_subsection_key_triples: Vec<(&'a str, Option<&'a [u8]>, &'a str)>,
1520
}
1621

17-
macro_rules! unwrap_or_return {
18-
($e:expr) => {
19-
match $e {
20-
Ok(val) => val,
21-
Err(_) => return,
22-
}
23-
};
24-
}
22+
const DEFAULT_TRIPLE: (&str, Option<&'static [u8]>, &str) = ("section", Some(b"subsection"), "key");
2523

26-
fuzz_target!(|ctx: Ctx| {
24+
fn fuzz(ctx: Ctx) -> Result<()> {
2725
let meta = Metadata::default();
2826
let options = Options::default();
29-
let file = unwrap_or_return!(File::from_bytes_no_includes(&ctx.input, meta.clone(), options.clone()));
27+
let file = File::from_bytes_no_includes(&ctx.input, meta.clone(), options.clone())?;
28+
29+
let mut triples = ctx.section_subsection_key_triples.iter();
30+
31+
let (section_name, subsection_name, key) = triples.next().unwrap_or(&DEFAULT_TRIPLE);
32+
_ = black_box(file.string(section_name, subsection_name.map(|x| BStr::new(x)), key));
33+
_ = black_box(file.string_by_key(BStr::new(key)));
34+
_ = black_box(file.string_filter(section_name, subsection_name.map(|x| BStr::new(x)), key, &mut |_| false));
35+
_ = black_box(file.string_filter_by_key(BStr::new(key), &mut |_| false));
36+
37+
let (section_name, subsection_name, key) = triples.next().unwrap_or(&DEFAULT_TRIPLE);
38+
_ = black_box(file.path(section_name, subsection_name.map(|x| BStr::new(x)), key));
39+
_ = black_box(file.path_by_key(BStr::new(key)));
40+
_ = black_box(file.path_filter(section_name, subsection_name.map(|x| BStr::new(x)), key, &mut |_| false));
41+
_ = black_box(file.path_filter_by_key(BStr::new(key), &mut |_| false));
42+
43+
let (section_name, subsection_name, key) = triples.next().unwrap_or(&DEFAULT_TRIPLE);
44+
_ = black_box(file.boolean(section_name, subsection_name.map(|x| BStr::new(x)), key));
45+
_ = black_box(file.boolean_by_key(BStr::new(key)));
46+
_ = black_box(file.boolean_filter(section_name, subsection_name.map(|x| BStr::new(x)), key, &mut |_| false));
47+
_ = black_box(file.boolean_filter_by_key(BStr::new(key), &mut |_| false));
48+
49+
let (section_name, subsection_name, key) = triples.next().unwrap_or(&DEFAULT_TRIPLE);
50+
_ = black_box(file.integer(section_name, subsection_name.map(|x| BStr::new(x)), key));
51+
_ = black_box(file.integer_by_key(BStr::new(key)));
52+
_ = black_box(file.integer_filter(section_name, subsection_name.map(|x| BStr::new(x)), key, &mut |_| false));
53+
_ = black_box(file.integer_filter_by_key(BStr::new(key), &mut |_| false));
54+
55+
let (section_name, subsection_name, key) = triples.next().unwrap_or(&DEFAULT_TRIPLE);
56+
_ = black_box(file.strings(section_name, subsection_name.map(|x| BStr::new(x)), key));
57+
_ = black_box(file.strings_by_key(BStr::new(key)));
58+
_ = black_box(file.strings_filter(section_name, subsection_name.map(|x| BStr::new(x)), key, &mut |_| false));
59+
_ = black_box(file.strings_filter_by_key(BStr::new(key), &mut |_| false));
60+
61+
let (section_name, subsection_name, key) = triples.next().unwrap_or(&DEFAULT_TRIPLE);
62+
_ = black_box(file.integers(section_name, subsection_name.map(|x| BStr::new(x)), key));
63+
_ = black_box(file.integers_by_key(BStr::new(key)));
64+
_ = black_box(file.integers_filter(section_name, subsection_name.map(|x| BStr::new(x)), key, &mut |_| false));
65+
_ = black_box(file.integers_filter_by_key(BStr::new(key), &mut |_| false));
66+
67+
let (section_name, subsection_name, key) = triples.next().unwrap_or(&DEFAULT_TRIPLE);
68+
_ = black_box(file.integers(section_name, subsection_name.map(|x| BStr::new(x)), key));
69+
_ = black_box(file.integers_by_key(BStr::new(key)));
70+
_ = black_box(file.integers_filter(section_name, subsection_name.map(|x| BStr::new(x)), key, &mut |_| false));
71+
_ = black_box(file.integers_filter_by_key(BStr::new(key), &mut |_| false));
72+
3073
_ = black_box(file.sections().count());
3174
_ = black_box(file.sections_and_ids().count());
3275
_ = black_box(file.sections_and_postmatter().count());
@@ -44,9 +87,14 @@ fuzz_target!(|ctx: Ctx| {
4487
}
4588

4689
let roundtrip_as_string: Vec<u8> = file.to_bstring().into();
47-
_ = unwrap_or_return!(black_box(File::from_bytes_no_includes(
90+
_ = black_box(File::from_bytes_no_includes(
4891
&roundtrip_as_string,
4992
meta.clone(),
5093
options.clone(),
51-
)));
94+
))?;
95+
Ok(())
96+
}
97+
98+
fuzz_target!(|ctx: Ctx| {
99+
_ = black_box(fuzz(ctx));
52100
});
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#!/usr/bin/env bash
2+
3+
set -eox pipefail
4+
5+
CWD=$(pwd)
6+
7+
ROOT=$1
8+
OUTPUT_CORPUS=$2
9+
FIXTURES_DIR=$(readlink -f $ROOT/gix-config/tests/fixtures)
10+
11+
echo $ROOT
12+
echo $FIXTURES_DIR
13+
find $FIXTURES_DIR -name "*.config" -exec zip -j $OUTPUT_CORPUS {} \;
14+
15+
# Generate configs.
16+
REPO=$(mktemp -d)
17+
cd $REPO
18+
bash $FIXTURES_DIR/make_config_repo.sh
19+
find . -name ".*" -exec zip $OUTPUT_CORPUS {} \;
20+
cd $CWD
21+
rm -r $REPO
22+

gix-ref/fuzz/fuzz_targets/fuzz_log.rs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,34 @@
11
#![no_main]
22

33
use anyhow::Result;
4+
use arbitrary::Arbitrary;
45
use gix_ref::file::log;
56
use libfuzzer_sys::fuzz_target;
67
use std::hint::black_box;
78

8-
fn fuzz(line: &[u8]) -> Result<()> {
9-
let line = log::LineRef::from_bytes(line)?;
9+
#[derive(Arbitrary, Debug)]
10+
struct Ctx<'a> {
11+
line_ref: &'a [u8],
12+
multi_line_reverse: &'a [u8],
13+
multi_line_forward: &'a [u8],
14+
}
15+
16+
fn fuzz(ctx: Ctx) -> Result<()> {
17+
let line = log::LineRef::from_bytes(ctx.line_ref)?;
1018
_ = black_box(line.previous_oid());
1119
_ = black_box(line.new_oid());
20+
21+
let mut buf = [0u8; 1024];
22+
let read = std::io::Cursor::new(ctx.multi_line_reverse);
23+
let mut iter = gix_ref::file::log::iter::reverse(read, &mut buf)?;
24+
_ = black_box(iter.map(|x| black_box(x)).count());
25+
26+
let mut iter = gix_ref::file::log::iter::forward(ctx.multi_line_forward);
27+
_ = black_box(iter.map(|x| black_box(x)).count());
28+
1229
Ok(())
1330
}
1431

15-
fuzz_target!(|ctx: &[u8]| {
32+
fuzz_target!(|ctx: Ctx| {
1633
_ = black_box(fuzz(ctx));
1734
});

0 commit comments

Comments
 (0)