diff options
author | Tim Peters <tim.peters@gmail.com> | 2001-06-02 08:02:56 (GMT) |
---|---|---|
committer | Tim Peters <tim.peters@gmail.com> | 2001-06-02 08:02:56 (GMT) |
commit | 23cf6be23cc4cd1efa8b7100ff1a6a179cb16092 (patch) | |
tree | 3731d82495fe0b872436e76d26a699be9125b2d6 /Lib/test | |
parent | 89e90d67aa73163b368f0dc42ed78310bda00ac5 (diff) | |
download | cpython-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.py | 66 |
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 |