Skip to content

Commit d48aab5

Browse files
author
raymond.hettinger
committed
Do not let overflows in enumerate() and count() pass silently.
git-svn-id: http://svn.python.org/projects/python/trunk@53666 6015fed2-1504-0410-9fe1-9d1591cc4771
1 parent f8954a2 commit d48aab5

3 files changed

Lines changed: 12 additions & 2 deletions

File tree

Lib/test/test_itertools.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,7 @@ def test_count(self):
5252
self.assertEqual(take(2, zip('abc',count(3))), [('a', 3), ('b', 4)])
5353
self.assertRaises(TypeError, count, 2, 3)
5454
self.assertRaises(TypeError, count, 'a')
55-
c = count(sys.maxint-2) # verify that rollover doesn't crash
56-
c.next(); c.next(); c.next(); c.next(); c.next()
55+
self.assertRaises(OverflowError, list, islice(count(sys.maxint-5), 10))
5756
c = count(3)
5857
self.assertEqual(repr(c), 'count(3)')
5958
c.next()

Modules/itertoolsmodule.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2073,6 +2073,11 @@ count_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
20732073
static PyObject *
20742074
count_next(countobject *lz)
20752075
{
2076+
if (lz->cnt == LONG_MAX) {
2077+
PyErr_SetString(PyExc_OverflowError,
2078+
"cannot count beyond LONG_MAX");
2079+
return NULL;
2080+
}
20762081
return PyInt_FromSsize_t(lz->cnt++);
20772082
}
20782083

Objects/enumobject.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,12 @@ enum_next(enumobject *en)
6262
PyObject *result = en->en_result;
6363
PyObject *it = en->en_sit;
6464

65+
if (en->en_index == LONG_MAX) {
66+
PyErr_SetString(PyExc_OverflowError,
67+
"enumerate() is limited to LONG_MAX items");
68+
return NULL;
69+
}
70+
6571
next_item = (*it->ob_type->tp_iternext)(it);
6672
if (next_item == NULL)
6773
return NULL;

0 commit comments

Comments
 (0)