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. # Test iterators.
import sys
import unittest import unittest
from test.support import run_unittest, TESTFN, unlink, cpython_only from test.support import run_unittest, TESTFN, unlink, cpython_only
import pickle import pickle
@ -48,6 +49,10 @@ class SequenceClass:
else: else:
raise IndexError raise IndexError
class UnlimitedSequenceClass:
def __getitem__(self, i):
return i
# Main test suite # Main test suite
class TestCase(unittest.TestCase): class TestCase(unittest.TestCase):
@ -919,6 +924,26 @@ class TestCase(unittest.TestCase):
lst.extend(gen()) lst.extend(gen())
self.assertEqual(len(lst), 760) 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(): def test_main():
run_unittest(TestCase) run_unittest(TestCase)

View File

@ -1168,6 +1168,7 @@ Guido van Rossum
Just van Rossum Just van Rossum
Hugo van Rossum Hugo van Rossum
Saskia van Rossum Saskia van Rossum
Clement Rouault
Donald Wallace Rouse II Donald Wallace Rouse II
Liam Routt Liam Routt
Todd Rovito Todd Rovito

View File

@ -10,6 +10,9 @@ Release date: tba
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #23985: Fixed integer overflow in iterator object. Patch by
Clement Rouault.
- Issue #23985: Fix a possible buffer overrun when deleting a slice from - Issue #23985: Fix a possible buffer overrun when deleting a slice from
the front of a bytearray and then appending some other bytes data. the front of a bytearray and then appending some other bytes data.

View File

@ -54,6 +54,11 @@ iter_iternext(PyObject *iterator)
seq = it->it_seq; seq = it->it_seq;
if (seq == NULL) if (seq == NULL)
return NULL; return NULL;
if (it->it_index == PY_SSIZE_T_MAX) {
PyErr_SetString(PyExc_OverflowError,
"iter index too large");
return NULL;
}
result = PySequence_GetItem(seq, it->it_index); result = PySequence_GetItem(seq, it->it_index);
if (result != NULL) { if (result != NULL) {