diff --git a/src/decoder/mod.rs b/src/decoder/mod.rs index 1f5c321..dc05d37 100644 --- a/src/decoder/mod.rs +++ b/src/decoder/mod.rs @@ -1382,6 +1382,14 @@ impl Decoder { )); } + if offsets[0] as usize > self.limits.intermediate_buffer_size + || bytes + .iter() + .any(|&x| x as usize > self.limits.intermediate_buffer_size) + { + return Err(TiffError::LimitsExceeded); + } + let mut res_img = Vec::with_capacity(offsets[0] as usize); for (idx, offset) in offsets.iter().enumerate() { diff --git a/tests/decode_images.rs b/tests/decode_images.rs index 59bcca0..d2e8543 100644 --- a/tests/decode_images.rs +++ b/tests/decode_images.rs @@ -385,3 +385,22 @@ fn test_stripped_image_overflow() { unexpected => panic!("Unexpected error {}", unexpected), } } + +#[test] +fn oom() { + let image = [ + 73, 73, 42, 0, 8, 0, 0, 0, 8, 0, 0, 1, 4, 0, 1, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 40, 1, 0, 0, + 0, 158, 0, 0, 251, 3, 1, 3, 0, 1, 0, 0, 0, 7, 0, 0, 0, 6, 1, 3, 0, 1, 0, 0, 0, 2, 0, 0, 0, + 17, 1, 4, 0, 1, 0, 0, 0, 3, 77, 0, 0, 1, 1, 3, 0, 1, 0, 0, 0, 3, 128, 0, 0, 22, 1, 4, 0, 1, + 0, 0, 0, 40, 0, 0, 0, 23, 1, 4, 0, 1, 0, 0, 0, 178, 48, 178, 178, 178, 178, 162, 178, + ]; + + let mut decoder = tiff::decoder::Decoder::new(std::io::Cursor::new(&image)).unwrap(); + + let err = decoder.read_image().unwrap_err(); + + match err { + tiff::TiffError::LimitsExceeded => {} + unexpected => panic!("Unexpected error {}", unexpected), + } +}