From aab1b34eadfbf48fde215a2f566ec2f0d209897b Mon Sep 17 00:00:00 2001 From: porkbrain Date: Fri, 5 Jul 2024 17:04:40 +0200 Subject: [PATCH 1/2] iterator returns upon encountering --- src/codecs/webp/decoder.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/codecs/webp/decoder.rs b/src/codecs/webp/decoder.rs index 584f20ac2f..a9d7b4b098 100644 --- a/src/codecs/webp/decoder.rs +++ b/src/codecs/webp/decoder.rs @@ -84,12 +84,14 @@ impl<'a, R: 'a + Read + Seek> AnimationDecoder<'a> for WebPDecoder { let mut img = RgbaImage::new(width, height); match self.decoder.inner.read_frame(&mut img) { Ok(delay) => (img, delay), + Err(image_webp::DecodingError::NoMoreFrames) => return None, Err(e) => return Some(Err(ImageError::from_webp_decode(e))), } } else { let mut img = RgbImage::new(width, height); match self.decoder.inner.read_frame(&mut img) { Ok(delay) => (img.convert(), delay), + Err(image_webp::DecodingError::NoMoreFrames) => return None, Err(e) => return Some(Err(ImageError::from_webp_decode(e))), } }; From a8e77f37da8c4ca5ebe0896cd953de66b9533566 Mon Sep 17 00:00:00 2001 From: porkbrain Date: Fri, 5 Jul 2024 17:05:11 +0200 Subject: [PATCH 2/2] Regression test swallowed errors --- tests/regression.rs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/tests/regression.rs b/tests/regression.rs index 78ff0321e5..eb1e20f518 100644 --- a/tests/regression.rs +++ b/tests/regression.rs @@ -54,7 +54,7 @@ fn check_webp_frames_regressions() { .join("*.webp"); let pattern = &*format!("{}", path.display()); for path in glob::glob(pattern).unwrap().filter_map(Result::ok) { - let bytes = fs::read(path).unwrap(); + let bytes = fs::read(&path).unwrap(); let cursor = Cursor::new(&bytes); let frame_count = image_webp::WebPDecoder::new(cursor.clone()) .unwrap() @@ -62,8 +62,18 @@ fn check_webp_frames_regressions() { let decoder = WebPDecoder::new(cursor).unwrap(); // The `take` guards against a potentially infinitely running iterator. // Since we take `frame_count + 1`, we can assume that the last iteration already returns `None`. - let actual_frame_count = decoder.into_frames().take(frame_count + 1).count(); - assert_eq!(actual_frame_count, frame_count); + // We then check that each frame has been decoded successfully. + let decoded_frames_count = decoder + .into_frames() + .take(frame_count + 1) + .enumerate() + .inspect(|(frame_index, frame_res)| { + if let Err(e) = frame_res { + panic!("Error decoding {path:?} frame {}: {e:?}", frame_index + 1); + } + }) + .count(); + assert_eq!(frame_count, decoded_frames_count); } }