Skip to content

Commit

Permalink
test: add fuzzing target for sysex7 roundtrip
Browse files Browse the repository at this point in the history
  • Loading branch information
Ben Leadbetter committed May 8, 2024
1 parent e08fbca commit 723c565
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 8 deletions.
8 changes: 8 additions & 0 deletions fuzz/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ default-features = false
features = [
"std",
"sysex8",
"sysex7",
]

[[bin]]
Expand All @@ -24,3 +25,10 @@ path = "./fuzz_targets/sysex8_payload_roundtrip.rs"
test = false
doc = false
bench = false

[[bin]]
name = "sysex7_payload_roundtrip"
path = "./fuzz_targets/sysex7_payload_roundtrip.rs"
test = false
doc = false
bench = false
22 changes: 22 additions & 0 deletions fuzz/fuzz_targets/sysex7_payload_roundtrip.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#![no_main]

use libfuzzer_sys::fuzz_target;
use midi2::{prelude::*, sysex7::*};

fuzz_target!(|data: &[u8]| {
let to_u7 = |b: u8| u7::new(b & 0x7F);
let mut message = Sysex7::<Vec<u32>>::new();
message.set_payload(data.iter().cloned().map(to_u7));

// payload is unchanged
let payload = message.payload().collect::<Vec<u7>>();
assert_eq!(
payload,
data.iter().cloned().map(to_u7).collect::<Vec<u7>>()
);

// message is in a valid state
let mut buffer = Vec::new();
buffer.extend_from_slice(message.data());
let _ = Sysex7::try_from(&buffer[..]).expect("Valid data");
});
7 changes: 1 addition & 6 deletions fuzz/fuzz_targets/sysex8_payload_roundtrip.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,9 @@
#![no_main]

use libfuzzer_sys::fuzz_target;
use midi2::{
prelude::*,
sysex8::*,
};
use midi2::{prelude::*, sysex8::*};

fuzz_target!(|data: &[u8]| {
eprintln!("Input data: {:?}", data);

let mut message = Sysex8::<Vec<u32>>::new();
message.set_payload(data.iter().cloned());

Expand Down
12 changes: 10 additions & 2 deletions src/message.rs
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,11 @@ impl<'a> core::convert::TryFrom<&'a [u32]> for UmpMessage<&'a [u32]> {
Eq,
)]
#[non_exhaustive]
#[cfg(any(feature = "channel-voice1", feature = "sysex7", feature = "system-common"))]
#[cfg(any(
feature = "channel-voice1",
feature = "sysex7",
feature = "system-common"
))]
pub enum BytesMessage<B: crate::buffer::Bytes> {
#[cfg(feature = "channel-voice1")]
ChannelVoice1(crate::channel_voice1::ChannelVoice1<B>),
Expand All @@ -97,7 +101,11 @@ pub enum BytesMessage<B: crate::buffer::Bytes> {
SystemCommon(crate::system_common::SystemCommon<B>),
}

#[cfg(any(feature = "channel-voice1", feature = "sysex7", feature = "system-common"))]
#[cfg(any(
feature = "channel-voice1",
feature = "sysex7",
feature = "system-common"
))]
impl<'a> core::convert::TryFrom<&'a [u8]> for BytesMessage<&'a [u8]> {
type Error = crate::error::Error;
fn try_from(buffer: &'a [u8]) -> Result<Self, Self::Error> {
Expand Down

0 comments on commit 723c565

Please sign in to comment.