#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
This commit is contained in:
parent
6fa30f40b5
commit
ceda6a67ce
|
@ -323,11 +323,30 @@ class OtherFileTests(unittest.TestCase):
|
|||
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():
|
||||
# Historically, these tests have been sloppy about removing TESTFN.
|
||||
# So get rid of it no matter what.
|
||||
try:
|
||||
run_unittest(AutoFileTests, OtherFileTests)
|
||||
run_unittest(AutoFileTests, OtherFileTests, StdoutTests)
|
||||
finally:
|
||||
if os.path.exists(TESTFN):
|
||||
os.unlink(TESTFN)
|
||||
|
|
|
@ -12,6 +12,10 @@ What's New in Python 2.5.3?
|
|||
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
|
||||
holds the last (strong) reference to its referent.
|
||||
|
||||
|
|
|
@ -1603,9 +1603,11 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
|
|||
"lost sys.stdout");
|
||||
}
|
||||
if (w != NULL) {
|
||||
Py_INCREF(w);
|
||||
err = PyFile_WriteString("\n", w);
|
||||
if (err == 0)
|
||||
PyFile_SoftSpace(w, 0);
|
||||
Py_DECREF(w);
|
||||
}
|
||||
Py_XDECREF(stream);
|
||||
stream = NULL;
|
||||
|
|
Loading…
Reference in New Issue