#3242: fix a crash in "print", if sys.stdout is set to a custom object,

whose write() method installs another sys.stdout.

Will backport.
This commit is contained in:
Amaury Forgeot d'Arc 2008-07-01 20:38:04 +00:00
parent dbd0ae383d
commit bdd941fac3
3 changed files with 25 additions and 1 deletions

View file

@ -503,13 +503,31 @@ class FileThreadingTests(unittest.TestCase):
self._test_close_open_io(io_func)
class StdoutTests(unittest.TestCase):
def test_move_stdout_on_write(self):
# Issue 3242: sys.stdout can be replaced (and freed) during a
# print statement; prevent a segfault in this case
save_stdout = sys.stdout
class File:
def write(self, data):
if '\n' in data:
sys.stdout = save_stdout
try:
sys.stdout = File()
print "some text"
finally:
sys.stdout = save_stdout
def test_main():
# Historically, these tests have been sloppy about removing TESTFN.
# So get rid of it no matter what.
try:
run_unittest(AutoFileTests, OtherFileTests, FileSubclassTests,
FileThreadingTests)
FileThreadingTests, StdoutTests)
finally:
if os.path.exists(TESTFN):
os.unlink(TESTFN)