| From 5222e2ba2d97cd716a379b4ae6bc62c5f7c2dd36 Mon Sep 17 00:00:00 2001 |
| From: Giacomo Stevanato <giaco.stevanato@gmail.com> |
| Date: Fri, 19 Feb 2021 12:15:37 +0100 |
| Subject: [PATCH 1/3] Increment self.len in specialized ZipImpl to avoid |
| underflow in size_hint |
| |
| (cherry picked from commit 66a260617a88ed1ad55a46f03c5a90d5ad3004d3) |
| --- |
| library/core/src/iter/adapters/zip.rs | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| diff --git a/library/core/src/iter/adapters/zip.rs b/library/core/src/iter/adapters/zip.rs |
| index 9f9835345200..f08bfac837fe 100644 |
| --- a/library/core/src/iter/adapters/zip.rs |
| +++ b/library/core/src/iter/adapters/zip.rs |
| @@ -200,6 +200,7 @@ fn next(&mut self) -> Option<(A::Item, B::Item)> { |
| } else if A::may_have_side_effect() && self.index < self.a.size() { |
| let i = self.index; |
| self.index += 1; |
| + self.len += 1; |
| // match the base implementation's potential side effects |
| // SAFETY: we just checked that `i` < `self.a.len()` |
| unsafe { |
| -- |
| 2.31.1 |
| |
| |
| From d39669fc8282830a374d19d204f7b4ee8eb1e381 Mon Sep 17 00:00:00 2001 |
| From: Giacomo Stevanato <giaco.stevanato@gmail.com> |
| Date: Fri, 19 Feb 2021 12:16:12 +0100 |
| Subject: [PATCH 2/3] Add test for underflow in specialized Zip's size_hint |
| |
| (cherry picked from commit 8b9ac4d4155c74db5b317046033ab9c05a09e351) |
| --- |
| library/core/tests/iter/adapters/zip.rs | 20 ++++++++++++++++++++ |
| 1 file changed, 20 insertions(+) |
| |
| diff --git a/library/core/tests/iter/adapters/zip.rs b/library/core/tests/iter/adapters/zip.rs |
| index 1fce0951e365..a59771039295 100644 |
| --- a/library/core/tests/iter/adapters/zip.rs |
| +++ b/library/core/tests/iter/adapters/zip.rs |
| @@ -245,3 +245,23 @@ fn test_double_ended_zip() { |
| assert_eq!(it.next_back(), Some((3, 3))); |
| assert_eq!(it.next(), None); |
| } |
| + |
| +#[test] |
| +fn test_issue_82282() { |
| + fn overflowed_zip(arr: &[i32]) -> impl Iterator<Item = (i32, &())> { |
| + static UNIT_EMPTY_ARR: [(); 0] = []; |
| + |
| + let mapped = arr.into_iter().map(|i| *i); |
| + let mut zipped = mapped.zip(UNIT_EMPTY_ARR.iter()); |
| + zipped.next(); |
| + zipped |
| + } |
| + |
| + let arr = [1, 2, 3]; |
| + let zip = overflowed_zip(&arr).zip(overflowed_zip(&arr)); |
| + |
| + assert_eq!(zip.size_hint(), (0, Some(0))); |
| + for _ in zip { |
| + panic!(); |
| + } |
| +} |
| -- |
| 2.31.1 |
| |
| |
| From 4b382167dd5ed5a6eac0cf314bfb86e3704b6e76 Mon Sep 17 00:00:00 2001 |
| From: Giacomo Stevanato <giaco.stevanato@gmail.com> |
| Date: Fri, 19 Feb 2021 12:17:48 +0100 |
| Subject: [PATCH 3/3] Remove useless comparison since now self.index <= |
| self.len is an invariant |
| |
| (cherry picked from commit aeb4ea739efb70e0002a4a9c4c7b8027dd0620b3) |
| --- |
| library/core/src/iter/adapters/zip.rs | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/library/core/src/iter/adapters/zip.rs b/library/core/src/iter/adapters/zip.rs |
| index f08bfac837fe..dcbcb1ce7200 100644 |
| --- a/library/core/src/iter/adapters/zip.rs |
| +++ b/library/core/src/iter/adapters/zip.rs |
| @@ -261,7 +261,7 @@ fn next_back(&mut self) -> Option<(A::Item, B::Item)> |
| if sz_a != sz_b { |
| let sz_a = self.a.size(); |
| if a_side_effect && sz_a > self.len { |
| - for _ in 0..sz_a - cmp::max(self.len, self.index) { |
| + for _ in 0..sz_a - self.len { |
| self.a.next_back(); |
| } |
| } |
| -- |
| 2.31.1 |
| |