Commit ceda6a67 authored by Amaury Forgeot d'Arc's avatar Amaury Forgeot d'Arc

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

whose write() method installs another sys.stdout.

Backport of r64633
parent 6fa30f40
...@@ -323,11 +323,30 @@ class OtherFileTests(unittest.TestCase): ...@@ -323,11 +323,30 @@ class OtherFileTests(unittest.TestCase):
os.unlink(TESTFN) os.unlink(TESTFN)
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(): def test_main():
# Historically, these tests have been sloppy about removing TESTFN. # Historically, these tests have been sloppy about removing TESTFN.
# So get rid of it no matter what. # So get rid of it no matter what.
try: try:
run_unittest(AutoFileTests, OtherFileTests) run_unittest(AutoFileTests, OtherFileTests, StdoutTests)
finally: finally:
if os.path.exists(TESTFN): if os.path.exists(TESTFN):
os.unlink(TESTFN) os.unlink(TESTFN)
......
...@@ -12,6 +12,10 @@ What's New in Python 2.5.3? ...@@ -12,6 +12,10 @@ What's New in Python 2.5.3?
Core and builtins Core and builtins
----------------- -----------------
- Issue #3242: Fix a crash inside the print statement, if sys.stdout is
set to a custom object whose write() method happens to install
another file in sys.stdout.
- Issue #3100: Corrected a crash on deallocation of a subclassed weakref which - Issue #3100: Corrected a crash on deallocation of a subclassed weakref which
holds the last (strong) reference to its referent. holds the last (strong) reference to its referent.
......
...@@ -1603,9 +1603,11 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) ...@@ -1603,9 +1603,11 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
"lost sys.stdout"); "lost sys.stdout");
} }
if (w != NULL) { if (w != NULL) {
Py_INCREF(w);
err = PyFile_WriteString("\n", w); err = PyFile_WriteString("\n", w);
if (err == 0) if (err == 0)
PyFile_SoftSpace(w, 0); PyFile_SoftSpace(w, 0);
Py_DECREF(w);
} }
Py_XDECREF(stream); Py_XDECREF(stream);
stream = NULL; stream = NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment