summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
authorTim Peters <tim.peters@gmail.com>2001-06-02 08:02:56 (GMT)
committerTim Peters <tim.peters@gmail.com>2001-06-02 08:02:56 (GMT)
commit23cf6be23cc4cd1efa8b7100ff1a6a179cb16092 (patch)
tree3731d82495fe0b872436e76d26a699be9125b2d6 /Lib/test
parent89e90d67aa73163b368f0dc42ed78310bda00ac5 (diff)
downloadcpython-23cf6be23cc4cd1efa8b7100ff1a6a179cb16092.zip
cpython-23cf6be23cc4cd1efa8b7100ff1a6a179cb16092.tar.gz
cpython-23cf6be23cc4cd1efa8b7100ff1a6a179cb16092.tar.bz2
Coredumpers from Michael Hudson, mutating dicts while printing or
converting to string. Critical bugfix candidate -- if you take this seriously <wink>.
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/test_mutants.py66
1 files changed, 65 insertions, 1 deletions
diff --git a/Lib/test/test_mutants.py b/Lib/test/test_mutants.py
index 3cd35d1..f981fe6 100644
--- a/Lib/test/test_mutants.py
+++ b/Lib/test/test_mutants.py
@@ -1,5 +1,6 @@
-from test_support import verbose
+from test_support import verbose, TESTFN
import random
+import os
# From SF bug #422121: Insecurities in dict comparison.
@@ -151,3 +152,66 @@ def test(n):
# See last comment block for clues about good values for n.
test(100)
+
+##########################################################################
+# Another segfault bug, distilled by Micheal Hundson from a c.l.py post.
+
+class Child:
+ def __init__(self, parent):
+ self.__dict__['parent'] = parent
+ def __getattr__(self, attr):
+ self.parent.a = 1
+ self.parent.b = 1
+ self.parent.c = 1
+ self.parent.d = 1
+ self.parent.e = 1
+ self.parent.f = 1
+ self.parent.g = 1
+ self.parent.h = 1
+ self.parent.i = 1
+ return getattr(self.parent, attr)
+
+class Parent:
+ def __init__(self):
+ self.a = Child(self)
+
+# Hard to say what this will print! May vary from time to time. But
+# we're specifically trying to test the tp_print slot here, and this is
+# the clearest way to do it. We print the result to a temp file so that
+# the expected-output file doesn't need to change.
+
+f = open(TESTFN, "w")
+print >> f, Parent().__dict__
+f.close()
+os.unlink(TESTFN)
+
+##########################################################################
+# And another core-dumper from Michael Hudson.
+
+dict = {}
+
+# Force dict to malloc its table.
+for i in range(1, 10):
+ dict[i] = i
+
+f = open(TESTFN, "w")
+
+class Machiavelli:
+ def __repr__(self):
+ dict.clear()
+
+ # Michael sez: "doesn't crash without this. don't know why."
+ # Tim sez: "luck of the draw; crashes with or without for me."
+ print >> f
+
+ return `"machiavelli"`
+
+ def __hash__(self):
+ return 0
+
+dict[Machiavelli()] = Machiavelli()
+
+print >> f, str(dict)
+f.close()
+os.unlink(TESTFN)
+del f, dict