Issue #23985: Fixed integer overflow in iterator object. Patch by

Clement Rouault.
This commit is contained in:
Serhiy Storchaka 2015-05-21 20:50:25 +03:00
parent cbfe07e06c
commit 4faf5c5655
4 changed files with 34 additions and 0 deletions

View file

@ -1,5 +1,6 @@
# Test iterators.
import sys
import unittest
from test.support import run_unittest, TESTFN, unlink, cpython_only
import pickle
@ -48,6 +49,10 @@ class SequenceClass:
else:
raise IndexError
class UnlimitedSequenceClass:
def __getitem__(self, i):
return i
# Main test suite
class TestCase(unittest.TestCase):
@ -919,6 +924,26 @@ class TestCase(unittest.TestCase):
lst.extend(gen())
self.assertEqual(len(lst), 760)
@cpython_only
def test_iter_overflow(self):
# Test for the issue 22939
it = iter(UnlimitedSequenceClass())
# Manually set `it_index` to PY_SSIZE_T_MAX-2 without a loop
it.__setstate__(sys.maxsize - 2)
self.assertEqual(next(it), sys.maxsize - 2)
self.assertEqual(next(it), sys.maxsize - 1)
with self.assertRaises(OverflowError):
next(it)
# Check that Overflow error is always raised
with self.assertRaises(OverflowError):
next(it)
def test_iter_neg_setstate(self):
it = iter(UnlimitedSequenceClass())
it.__setstate__(-42)
self.assertEqual(next(it), 0)
self.assertEqual(next(it), 1)
def test_main():
run_unittest(TestCase)