GH-141312: Allow only integers to longrangeiter_setstate state (GH-141317)
This fixes an assertion error when the new computed start is not an integer.
This commit is contained in:
@@ -470,6 +470,16 @@ class RangeTest(unittest.TestCase):
|
|||||||
it.__setstate__(2**64 - 7)
|
it.__setstate__(2**64 - 7)
|
||||||
self.assertEqual(list(it), [12, 10])
|
self.assertEqual(list(it), [12, 10])
|
||||||
|
|
||||||
|
def test_iterator_invalid_setstate(self):
|
||||||
|
for invalid_value in (1.0, ""):
|
||||||
|
ranges = (('rangeiter', range(10, 100, 2)),
|
||||||
|
('longrangeiter', range(10, 2**65, 2)))
|
||||||
|
for rng_name, rng in ranges:
|
||||||
|
with self.subTest(invalid_value=invalid_value, range=rng_name):
|
||||||
|
it = iter(rng)
|
||||||
|
with self.assertRaises(TypeError):
|
||||||
|
it.__setstate__(invalid_value)
|
||||||
|
|
||||||
def test_odd_bug(self):
|
def test_odd_bug(self):
|
||||||
# This used to raise a "SystemError: NULL result without error"
|
# This used to raise a "SystemError: NULL result without error"
|
||||||
# because the range validation step was eating the exception
|
# because the range validation step was eating the exception
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
Fix the assertion failure in the ``__setstate__`` method of the range iterator
|
||||||
|
when a non-integer argument is passed. Patch by Sergey Miryanov.
|
||||||
@@ -1042,6 +1042,11 @@ longrangeiter_reduce(PyObject *op, PyObject *Py_UNUSED(ignored))
|
|||||||
static PyObject *
|
static PyObject *
|
||||||
longrangeiter_setstate(PyObject *op, PyObject *state)
|
longrangeiter_setstate(PyObject *op, PyObject *state)
|
||||||
{
|
{
|
||||||
|
if (!PyLong_CheckExact(state)) {
|
||||||
|
PyErr_Format(PyExc_TypeError, "state must be an int, not %T", state);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
longrangeiterobject *r = (longrangeiterobject*)op;
|
longrangeiterobject *r = (longrangeiterobject*)op;
|
||||||
PyObject *zero = _PyLong_GetZero(); // borrowed reference
|
PyObject *zero = _PyLong_GetZero(); // borrowed reference
|
||||||
int cmp;
|
int cmp;
|
||||||
|
|||||||
Reference in New Issue
Block a user