]> granicus.if.org Git - python/commitdiff
Issue #23985: Fixed integer overflow in iterator object. Patch by
authorSerhiy Storchaka <storchaka@gmail.com>
Thu, 21 May 2015 17:50:25 +0000 (20:50 +0300)
committerSerhiy Storchaka <storchaka@gmail.com>
Thu, 21 May 2015 17:50:25 +0000 (20:50 +0300)
Clement Rouault.

Lib/test/test_iter.py
Misc/ACKS
Misc/NEWS
Objects/iterobject.c

index e06f239ddab43f74227fa465e9e7bdd2d272e417..abc408f86935de1048481a40e531fd6171f2c152 100644 (file)
@@ -1,5 +1,6 @@
 # Test iterators.
 
+import sys
 import unittest
 from test.support import run_unittest, TESTFN, unlink, cpython_only
 import pickle
@@ -48,6 +49,10 @@ class SequenceClass:
         else:
             raise IndexError
 
+class UnlimitedSequenceClass:
+    def __getitem__(self, i):
+        return i
+
 # Main test suite
 
 class TestCase(unittest.TestCase):
@@ -919,6 +924,26 @@ class TestCase(unittest.TestCase):
         lst.extend(gen())
         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():
     run_unittest(TestCase)
index 7de6de6d423ed45e2eedb9ebdc200a4ef43fc517..b377050ec7c7fa3905c28ab5f7c1adcb4df68520 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -1168,6 +1168,7 @@ Guido van Rossum
 Just van Rossum
 Hugo van Rossum
 Saskia van Rossum
+Clement Rouault
 Donald Wallace Rouse II
 Liam Routt
 Todd Rovito
index 94ea12bff2bc8b0a45bc43aac385ed8696e5aaee..edd6aaac2ba3fbefc0535428ec3a0720aaaad33d 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@ Release date: tba
 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
   the front of a bytearray and then appending some other bytes data.
 
index 77ff8106fd214eb13a2b3075cfc95923cb7cc492..3047d6b02f8102ff5b57513a7a102120ce3b6ef5 100644 (file)
@@ -54,6 +54,11 @@ iter_iternext(PyObject *iterator)
     seq = it->it_seq;
     if (seq == 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);
     if (result != NULL) {