Avoid overflow in std::iter::Skip::count

The call to `count` on the inner iterator can overflow even if `Skip` itself would return less that `usize::max_value()` items.
This commit is contained in:
Oliver Middleton 2020-01-22 20:28:28 +00:00
parent 900811e430
commit 9d3e84432d
2 changed files with 16 additions and 2 deletions

View File

@ -1815,8 +1815,14 @@ where
}
#[inline]
fn count(self) -> usize {
self.iter.count().saturating_sub(self.n)
fn count(mut self) -> usize {
if self.n > 0 {
// nth(n) skips n+1
if self.iter.nth(self.n - 1).is_none() {
return 0;
}
}
self.iter.count()
}
#[inline]

View File

@ -0,0 +1,8 @@
// run-pass
// only-32bit too impatient for 2⁶⁴ items
// compile-flags: -C overflow-checks -C opt-level=3
fn main() {
let i = (0..usize::max_value()).chain(0..10).skip(usize::max_value());
assert_eq!(i.count(), 10);
}