summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorAmaury Forgeot d'Arc <amauryfa@gmail.com>2009-01-12 23:36:55 (GMT)
committerAmaury Forgeot d'Arc <amauryfa@gmail.com>2009-01-12 23:36:55 (GMT)
commita40d57366432cd65915b92fe3e6bfe1d5ad63be0 (patch)
tree45ef11eae7d47a373fea86cba4b1b0c4902bb93a /Lib
parentf94d7fa5fb90df0163cffca2864885a7da49d4f6 (diff)
downloadcpython-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')
-rw-r--r--Lib/test/crashers/iter.py53
-rw-r--r--Lib/test/test_iter.py22
2 files changed, 22 insertions, 53 deletions
diff --git a/Lib/test/crashers/iter.py b/Lib/test/crashers/iter.py
deleted file mode 100644
index 081dcbc..0000000
--- a/Lib/test/crashers/iter.py
+++ /dev/null
@@ -1,53 +0,0 @@
-# Calls to PyIter_Next, or direct calls to tp_iternext, on an object
-# which might no longer be an iterable because its 'next' method was
-# removed. These are all variants of Issue3720.
-
-"""
-Run this script with an argument between 1 and <N> to test for
-different crashes.
-"""
-N = 8
-
-import sys
-
-class Foo(object):
- def __iter__(self):
- return self
- def next(self):
- del Foo.next
- return (1, 2)
-
-def case1():
- list(enumerate(Foo()))
-
-def case2():
- x, y = Foo()
-
-def case3():
- filter(None, Foo())
-
-def case4():
- map(None, Foo(), Foo())
-
-def case5():
- max(Foo())
-
-def case6():
- sum(Foo(), ())
-
-def case7():
- dict(Foo())
-
-def case8():
- sys.stdout.writelines(Foo())
-
-# etc...
-
-
-if __name__ == '__main__':
- if len(sys.argv) < 2:
- print __doc__.replace('<N>', str(N))
- else:
- n = int(sys.argv[1])
- func = globals()['case%d' % n]
- func()
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)