Skip to content

Commit ad6ec5d

Browse files
authored
avoid DriverMode branching on byte driver (#219)
1 parent 04e6a5b commit ad6ec5d

File tree

2 files changed

+24
-18
lines changed

2 files changed

+24
-18
lines changed

bin/cargo-bolero/src/libfuzzer.rs

+5
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,11 @@ pub(crate) fn reduce(selection: &Selection, reduce: &reduce::Args) -> Result<()>
8989

9090
let inputs = write_control_file(&mut control_file, &corpus_dir)?;
9191

92+
// no point in shrinking an empty corpus
93+
if inputs.is_empty() {
94+
return Ok(());
95+
}
96+
9297
let mut cmd = test_target.command();
9398

9499
let mut args = vec![

lib/bolero-generator/src/driver/bytes.rs

+19-18
Original file line numberDiff line numberDiff line change
@@ -30,31 +30,32 @@ impl<'a> FillBytes for ByteSliceDriver<'a> {
3030

3131
#[inline]
3232
fn peek_bytes(&mut self, offset: usize, bytes: &mut [u8]) -> Option<()> {
33-
match self.mode {
34-
DriverMode::Direct => {
35-
if (offset + bytes.len()) > self.input.len() {
36-
None
37-
} else {
38-
bytes.copy_from_slice(&self.input[offset..(offset + bytes.len())]);
39-
Some(())
40-
}
33+
match self.input.len().checked_sub(offset) {
34+
None | Some(0) => {
35+
// no bytes left so fill in zeros
36+
bytes.fill(0);
4137
}
42-
DriverMode::Forced => {
43-
if offset < self.input.len() {
44-
let copy_len = core::cmp::min(bytes.len(), self.input.len() - offset);
45-
bytes[..copy_len].copy_from_slice(&self.input[offset..(offset + copy_len)]);
46-
bytes[copy_len..].fill(0);
47-
} else {
48-
bytes.fill(0);
49-
}
50-
Some(())
38+
Some(remaining_len) if remaining_len >= bytes.len() => {
39+
let input = &self.input[offset..];
40+
let input = &input[..bytes.len()];
41+
bytes.copy_from_slice(input);
42+
}
43+
Some(remaining_len) => {
44+
let input = &self.input[offset..];
45+
// we don't have enough bytes to fill the whole output
46+
let (head, tail) = bytes.split_at_mut(remaining_len);
47+
head.copy_from_slice(input);
48+
tail.fill(0);
5149
}
5250
}
51+
52+
Some(())
5353
}
5454

5555
#[inline]
5656
fn consume_bytes(&mut self, consumed: usize) {
57-
self.input = &self.input[core::cmp::min(consumed, self.input.len())..];
57+
let consumed = consumed.min(self.input.len());
58+
self.input = &self.input[consumed..];
5859
}
5960
}
6061

0 commit comments

Comments
 (0)