diff --git a/src/decoder/image.rs b/src/decoder/image.rs index b5f7200..f13a28b 100644 --- a/src/decoder/image.rs +++ b/src/decoder/image.rs @@ -145,12 +145,15 @@ impl Image { .map(SampleFormat::from_u16_exhaustive) .collect(); + let Some(format) = sample_format.first().copied() else { + // Reject empty sample formats + return Err(TiffFormatError::InvalidTagValueType(Tag::SampleFormat).into()); + }; // TODO: for now, only homogenous formats across samples are supported. - if !sample_format.windows(2).all(|s| s[0] == s[1]) { + if !sample_format.iter().all(|&s| s == format) { return Err(TiffUnsupportedError::UnsupportedSampleFormat(sample_format).into()); } - - sample_format[0] + format } None => SampleFormat::Uint, }; diff --git a/src/encoder/mod.rs b/src/encoder/mod.rs index 42697ac..a7854fa 100644 --- a/src/encoder/mod.rs +++ b/src/encoder/mod.rs @@ -37,8 +37,9 @@ pub type Predictor = crate::tags::Predictor; #[cfg(feature = "deflate")] pub type DeflateLevel = compression::DeflateLevel; -#[derive(Clone, Copy, PartialEq)] +#[derive(Clone, Copy, PartialEq, Default)] pub enum Compression { + #[default] Uncompressed, #[cfg(feature = "lzw")] Lzw, @@ -47,12 +48,6 @@ pub enum Compression { Packbits, } -impl Default for Compression { - fn default() -> Self { - Self::Uncompressed - } -} - impl Compression { fn tag(&self) -> CompressionMethod { match self { diff --git a/tests/fuzz_images/oor_panic/sample-format-empty-vec.bin b/tests/fuzz_images/oor_panic/sample-format-empty-vec.bin new file mode 100644 index 0000000..de4e2d2 Binary files /dev/null and b/tests/fuzz_images/oor_panic/sample-format-empty-vec.bin differ