Skip to content

Commit 0d71f7f

Browse files
committed
Stop iterator on error
1 parent b4d2fd3 commit 0d71f7f

File tree

2 files changed

+17
-5
lines changed

2 files changed

+17
-5
lines changed

src/reader/mod.rs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -470,13 +470,15 @@ impl<R: Read> IntoIterator for Decoder<R> {
470470
fn into_iter(self) -> Self::IntoIter {
471471
DecoderIter {
472472
inner: self,
473+
ended: false,
473474
}
474475
}
475476
}
476477

477478
/// Use `decoder.into_iter()` to iterate over the frames
478479
pub struct DecoderIter<R: Read> {
479480
inner: Decoder<R>,
481+
ended: bool,
480482
}
481483

482484
impl<R: Read> DecoderIter<R> {
@@ -494,10 +496,20 @@ impl<R: Read> Iterator for DecoderIter<R> {
494496
type Item = Result<Frame<'static>, DecodingError>;
495497

496498
fn next(&mut self) -> Option<Self::Item> {
497-
match self.inner.read_next_frame() {
498-
Ok(Some(_)) => self.inner.take_current_frame().map(Ok),
499-
Ok(None) => None,
500-
Err(err) => Some(Err(err)),
499+
if !self.ended {
500+
match self.inner.read_next_frame() {
501+
Ok(Some(_)) => self.inner.take_current_frame().map(Ok),
502+
Ok(None) => {
503+
self.ended = true;
504+
None
505+
},
506+
Err(err) => {
507+
self.ended = true;
508+
Some(Err(err))
509+
},
510+
}
511+
} else {
512+
None
501513
}
502514
}
503515
}

tests/stall.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ fn test_truncated_file() {
5151
let truncated = &data[..len];
5252
// it's expected to fail often, but should not stall or panic
5353
if let Ok(d) = gif::DecodeOptions::new().read_info(truncated) {
54-
let _ = d.into_iter().take_while(|f| f.is_ok()).count();
54+
let _ = d.into_iter().count();
5555
}
5656
}
5757
}

0 commit comments

Comments
 (0)