From 0d71f7ffd1b5f9d09e646cb66f22c12627a1ca92 Mon Sep 17 00:00:00 2001 From: Kornel Date: Mon, 22 Jan 2024 11:55:55 +0000 Subject: [PATCH] Stop iterator on error --- src/reader/mod.rs | 20 ++++++++++++++++---- tests/stall.rs | 2 +- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/reader/mod.rs b/src/reader/mod.rs index a746ee9..73fe1b2 100644 --- a/src/reader/mod.rs +++ b/src/reader/mod.rs @@ -470,6 +470,7 @@ impl IntoIterator for Decoder { fn into_iter(self) -> Self::IntoIter { DecoderIter { inner: self, + ended: false, } } } @@ -477,6 +478,7 @@ impl IntoIterator for Decoder { /// Use `decoder.into_iter()` to iterate over the frames pub struct DecoderIter { inner: Decoder, + ended: bool, } impl DecoderIter { @@ -494,10 +496,20 @@ impl Iterator for DecoderIter { type Item = Result, DecodingError>; fn next(&mut self) -> Option { - match self.inner.read_next_frame() { - Ok(Some(_)) => self.inner.take_current_frame().map(Ok), - Ok(None) => None, - Err(err) => Some(Err(err)), + if !self.ended { + match self.inner.read_next_frame() { + Ok(Some(_)) => self.inner.take_current_frame().map(Ok), + Ok(None) => { + self.ended = true; + None + }, + Err(err) => { + self.ended = true; + Some(Err(err)) + }, + } + } else { + None } } } diff --git a/tests/stall.rs b/tests/stall.rs index b99bfbb..0e5beff 100644 --- a/tests/stall.rs +++ b/tests/stall.rs @@ -51,7 +51,7 @@ fn test_truncated_file() { let truncated = &data[..len]; // it's expected to fail often, but should not stall or panic if let Ok(d) = gif::DecodeOptions::new().read_info(truncated) { - let _ = d.into_iter().take_while(|f| f.is_ok()).count(); + let _ = d.into_iter().count(); } } }