From: Georg Brandl Date: Sun, 6 Aug 2006 08:23:59 +0000 (+0000) Subject: Bug #1535165: fixed a segfault in input() and raw_input() when X-Git-Tag: v2.4.4c1~133 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4eb963436880c58b3b5a64e486565b655269b793;p=thirdparty%2FPython%2Fcpython.git Bug #1535165: fixed a segfault in input() and raw_input() when sys.stdin is closed. (backport from rev. 51129) --- diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index f023b117dc8e..2d044dc437b9 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -1039,6 +1039,14 @@ class BuiltinTest(unittest.TestCase): self.assertEqual(input('testing\n'), 2) self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.') self.assertEqual(raw_input('testing\n'), 'Dear John') + + # SF 1535165: don't segfault on closed stdin + # sys.stdout must be a regular file for triggering + sys.stdout = savestdout + sys.stdin.close() + self.assertRaises(ValueError, input, 'prompt') + + sys.stdout = BitBucket() sys.stdin = cStringIO.StringIO("NULL\0") self.assertRaises(TypeError, input, 42, 42) sys.stdin = cStringIO.StringIO(" 'whitespace'") diff --git a/Misc/NEWS b/Misc/NEWS index 427e6fe21ac5..c15925720c5e 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,9 @@ What's New in Python 2.4.4c1? Core and builtins ----------------- +- Bug #1535165: fixed a segfault in input() and raw_input() when + sys.stdin is closed. + - Bug #1524310: Properly report errors from FindNextFile in os.listdir. - Bug #927248: Recursive method-wrapper objects can now safely diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 052ff3c5ed17..6d30391712c6 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -1609,7 +1609,7 @@ builtin_raw_input(PyObject *self, PyObject *args) if (PyFile_WriteString(" ", fout) != 0) return NULL; } - if (PyFile_Check(fin) && PyFile_Check(fout) + if (PyFile_AsFile(fin) && PyFile_AsFile(fout) && isatty(fileno(PyFile_AsFile(fin))) && isatty(fileno(PyFile_AsFile(fout)))) { PyObject *po;