diff options
| author | Amaury Forgeot d'Arc <amauryfa@gmail.com> | 2009-01-12 23:36:55 (GMT) |
|---|---|---|
| committer | Amaury Forgeot d'Arc <amauryfa@gmail.com> | 2009-01-12 23:36:55 (GMT) |
| commit | a40d57366432cd65915b92fe3e6bfe1d5ad63be0 (patch) | |
| tree | 45ef11eae7d47a373fea86cba4b1b0c4902bb93a /Lib/test/test_iter.py | |
| parent | f94d7fa5fb90df0163cffca2864885a7da49d4f6 (diff) | |
| download | cpython-a40d57366432cd65915b92fe3e6bfe1d5ad63be0.zip cpython-a40d57366432cd65915b92fe3e6bfe1d5ad63be0.tar.gz cpython-a40d57366432cd65915b92fe3e6bfe1d5ad63be0.tar.bz2 | |
#3720: Interpreter crashes when an evil iterator removes its own next function.
Now the slot is filled with a function that always raises.
Will not backport: extensions compiled with 2.6.x would not run on 2.6.0.
Diffstat (limited to 'Lib/test/test_iter.py')
| -rw-r--r-- | Lib/test/test_iter.py | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/Lib/test/test_iter.py b/Lib/test/test_iter.py index f83de78..e847018 100644 --- a/Lib/test/test_iter.py +++ b/Lib/test/test_iter.py @@ -120,6 +120,13 @@ class TestCase(unittest.TestCase): def test_seq_class_iter(self): self.check_iterator(iter(SequenceClass(10)), range(10)) + # Test a new_style class with __iter__ but no next() method + def test_new_style_iter_class(self): + class IterClass(object): + def __iter__(self): + return self + self.assertRaises(TypeError, iter, IterClass()) + # Test two-argument iter() with callable instance def test_iter_callable(self): class C: @@ -877,6 +884,21 @@ class TestCase(unittest.TestCase): self.assertEqual(list(b), zip(range(5), range(5))) self.assertEqual(list(b), []) + def test_3720(self): + # Avoid a crash, when an iterator deletes its next() method. + class BadIterator(object): + def __iter__(self): + return self + def next(self): + del BadIterator.next + return 1 + + try: + for i in BadIterator() : + pass + except TypeError: + pass + def test_main(): run_unittest(TestCase) |
