mirror of https://github.com/python/cpython
Issue #23985: Fixed integer overflow in iterator object. Patch by
Clement Rouault.
This commit is contained in:
parent
cbfe07e06c
commit
4faf5c5655
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Reference in New Issue