diff --git a/src/peek_nth.rs b/src/peek_nth.rs index b03a3ef5f..d56fdb0b2 100644 --- a/src/peek_nth.rs +++ b/src/peek_nth.rs @@ -69,7 +69,7 @@ where /// assert_eq!(iter.peek_nth(1), None); /// ``` pub fn peek_nth(&mut self, n: usize) -> Option<&I::Item> { - let unbuffered_items = (n + 1).saturating_sub(self.buf.len()); + let unbuffered_items = n.checked_add(1)?.saturating_sub(self.buf.len()); self.buf.extend(self.iter.by_ref().take(unbuffered_items)); @@ -110,7 +110,7 @@ where /// assert_eq!(iter.peek_nth_mut(1), None); /// ``` pub fn peek_nth_mut(&mut self, n: usize) -> Option<&mut I::Item> { - let unbuffered_items = (n + 1).saturating_sub(self.buf.len()); + let unbuffered_items = n.checked_add(1)?.saturating_sub(self.buf.len()); self.buf.extend(self.iter.by_ref().take(unbuffered_items)); diff --git a/tests/test_std.rs b/tests/test_std.rs index e1bd8cbbc..7793592b5 100644 --- a/tests/test_std.rs +++ b/tests/test_std.rs @@ -829,6 +829,12 @@ fn test_peek_nth() { assert_eq!(iter.peek_nth(0), None); assert_eq!(iter.peek_nth(1), None); + + // Issue #1067: peek_nth(usize::MAX) used to panic in debug builds + // because of the n + 1 overflow. Should just return None now. + let mut iter = peek_nth(nums.iter().copied()); + assert_eq!(iter.peek_nth(usize::MAX), None); + assert_eq!(iter.peek_nth_mut(usize::MAX), None); } #[test]