diff --git a/pure-magic/src/readers/slice.rs b/pure-magic/src/readers/slice.rs index aab2b67..24e40f8 100644 --- a/pure-magic/src/readers/slice.rs +++ b/pure-magic/src/readers/slice.rs @@ -172,7 +172,11 @@ where let start = self.stream_pos; let mut end = 0; - for b in &self.buf.as_ref()[start as usize..] { + let Some(buf) = self.buf.as_ref().get(start as usize..) else { + return Ok(&[]); + }; + + for b in buf { if limit - end == 0 { break; } @@ -572,6 +576,14 @@ mod tests { // === read_while_or_limit === + #[test] + fn test_read_while_or_limit_stream_pos_past_end() { + // stream_pos > buf.len() previously cause an OOB panic via unchecked slice indexing + let mut r = BufReader::from_slice(b"hello"); + r.stream_pos = 10; // past end + assert_eq!(r.read_while_or_limit(|_| true, 100).unwrap(), b""); + } + #[test] fn test_read_while_or_limit_all_match() { let mut r = BufReader::from_slice(b"hello world");