about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDylan DPC <dylan.dpc@gmail.com>2021-02-12 22:53:32 +0100
committerGitHub <noreply@github.com>2021-02-12 22:53:32 +0100
commit0cfba2fd090834c909d5ed9deccdee8170da791b (patch)
tree44dc801719660800028a160334a7c36c85b0f1eb
parent58d72aedeee8dcce9cf227d3ac34088e88494939 (diff)
parent86a4b27475aab52b998c15f5758540697cc9cff0 (diff)
downloadrust-0cfba2fd090834c909d5ed9deccdee8170da791b.tar.gz
rust-0cfba2fd090834c909d5ed9deccdee8170da791b.zip
Rollup merge of #81741 - sdroege:zip-trusted-random-access-specialization-panic-safety, r=KodrAus
Increment `self.index` before calling `Iterator::self.a.__iterator_ge…

…`t_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
-rw-r--r--library/core/src/iter/adapters/zip.rs7
1 files changed, 4 insertions, 3 deletions
diff --git a/library/core/src/iter/adapters/zip.rs b/library/core/src/iter/adapters/zip.rs
index 98b8dca9614..9f983534520 100644
--- a/library/core/src/iter/adapters/zip.rs
+++ b/library/core/src/iter/adapters/zip.rs
@@ -198,12 +198,13 @@ where
                 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