45 lines
1.8 KiB
Diff
45 lines
1.8 KiB
Diff
|
From 40d3f2d7ef5835317fe9df9ecc01f4c363def4fd Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= <sebastian@centricular.com>
|
||
|
Date: Thu, 4 Feb 2021 10:23:01 +0200
|
||
|
Subject: [PATCH] Increment `self.index` before calling
|
||
|
`Iterator::self.a.__iterator_get_unchecked` in `Zip` `TrustedRandomAccess`
|
||
|
specialization
|
||
|
|
||
|
Otherwise if `Iterator::self.a.__iterator_get_unchecked` panics the
|
||
|
index would not have been incremented yet and another call to
|
||
|
`Iterator::next` would read from the same index again, which is not
|
||
|
allowed according to the API contract of `TrustedRandomAccess` for
|
||
|
`!Clone`.
|
||
|
|
||
|
Fixes https://github.com/rust-lang/rust/issues/81740
|
||
|
|
||
|
(cherry picked from commit 86a4b27475aab52b998c15f5758540697cc9cff0)
|
||
|
---
|
||
|
library/core/src/iter/adapters/zip.rs | 7 ++++---
|
||
|
1 file changed, 4 insertions(+), 3 deletions(-)
|
||
|
|
||
|
diff --git a/library/core/src/iter/adapters/zip.rs b/library/core/src/iter/adapters/zip.rs
|
||
|
index 98b8dca96140..9f9835345200 100644
|
||
|
--- a/library/core/src/iter/adapters/zip.rs
|
||
|
+++ b/library/core/src/iter/adapters/zip.rs
|
||
|
@@ -198,12 +198,13 @@ fn next(&mut self) -> Option<(A::Item, B::Item)> {
|
||
|
Some((self.a.__iterator_get_unchecked(i), self.b.__iterator_get_unchecked(i)))
|
||
|
}
|
||
|
} else if A::may_have_side_effect() && self.index < self.a.size() {
|
||
|
+ let i = self.index;
|
||
|
+ self.index += 1;
|
||
|
// match the base implementation's potential side effects
|
||
|
- // SAFETY: we just checked that `self.index` < `self.a.len()`
|
||
|
+ // SAFETY: we just checked that `i` < `self.a.len()`
|
||
|
unsafe {
|
||
|
- self.a.__iterator_get_unchecked(self.index);
|
||
|
+ self.a.__iterator_get_unchecked(i);
|
||
|
}
|
||
|
- self.index += 1;
|
||
|
None
|
||
|
} else {
|
||
|
None
|
||
|
--
|
||
|
2.31.1
|
||
|
|