Bug fixes for Arbitrary impl

This commit is contained in:
Chris Hennick 2023-05-13 14:16:58 -07:00
parent c79f734a11
commit 6e4d60e0ca
No known key found for this signature in database
GPG key ID: 25653935CC8B6C74

View file

@ -139,18 +139,18 @@ pub struct FileOptions {
} }
#[cfg(fuzzing)] #[cfg(fuzzing)]
impl arbitrary::Arbitrary for FileOptions { impl arbitrary::Arbitrary<'_> for FileOptions {
fn arbitrary(u: &mut Unstructured) -> arbitrary::Result<Self> { fn arbitrary(u: &mut arbitrary::Unstructured) -> arbitrary::Result<Self> {
let mut options = FileOptions { let mut options = FileOptions {
compression_method: CompressionMethod::arbitrary(&mut u)?, compression_method: CompressionMethod::arbitrary(u)?,
compression_level: Option::<CompressionLevel>::arbitrary(&mut u)?, compression_level: Option::<i32>::arbitrary(u)?,
last_modified_time: DateTime::arbitrary(&mut u)?, last_modified_time: DateTime::arbitrary(u)?,
permissions: Option::<u32>::arbitrary(&mut u)?, permissions: Option::<u32>::arbitrary(u)?,
large_file: bool::arbitrary(&mut u)?, large_file: bool::arbitrary(u)?,
encrypt_with: Option::<ZipCryptoKeys>::arbitrary(&mut u)?, encrypt_with: Option::<ZipCryptoKeys>::arbitrary(u)?,
extra_data: Vec::with_capacity(u16::MAX as usize), extra_data: Vec::with_capacity(u16::MAX as usize),
central_extra_data: Vec::with_capacity(u16::MAX as usize), central_extra_data: Vec::with_capacity(u16::MAX as usize),
alignment: u8::arbitrary(&mut u)? as u16 + 1, alignment: u8::arbitrary(u)? as u16 + 1,
}; };
#[derive(arbitrary::Arbitrary)] #[derive(arbitrary::Arbitrary)]
struct ExtraDataField { struct ExtraDataField {
@ -158,10 +158,11 @@ impl arbitrary::Arbitrary for FileOptions {
data: Vec<u8>, data: Vec<u8>,
central_only: bool, central_only: bool,
} }
let extra_data = Vec::<ExtraDataField>::arbitrary(&mut u)?; let extra_data = Vec::<ExtraDataField>::arbitrary(u)?;
for field in extra_data { for field in extra_data {
options.add_extra_data(field.header_id, field.data.as_slice(), field.central_only) options
.map_err(|_| arbitrary::Error::IncorrectFormat); .add_extra_data(field.header_id, field.data.as_slice(), field.central_only)
.map_err(|_| arbitrary::Error::IncorrectFormat)?;
} }
Ok(options) Ok(options)
} }