[3.14] GH-141312: Allow only integers to longrangeiter_setstate state (GH-141317) (GH-141559)

This fixes an assertion error when the new computed start is not an integer.
(cherry picked from commit 10bec7c1eb)

Co-authored-by: Sergey Miryanov <sergey.miryanov@gmail.com>
This commit is contained in:
Miss Islington (bot) 2025-11-15 20:30:25 +01:00 committed by GitHub
parent 21e43d5e83
commit 79c136f87b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 17 additions and 0 deletions

View file

@ -470,6 +470,16 @@ class RangeTest(unittest.TestCase):
it.__setstate__(2**64 - 7)
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):
# This used to raise a "SystemError: NULL result without error"
# because the range validation step was eating the exception

View file

@ -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.

View file

@ -1042,6 +1042,11 @@ longrangeiter_reduce(PyObject *op, PyObject *Py_UNUSED(ignored))
static PyObject *
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;
PyObject *zero = _PyLong_GetZero(); // borrowed reference
int cmp;