From 11bd11922657f582ee05f1d3cefe32c3a9e51cb7 Mon Sep 17 00:00:00 2001 From: Neal Norwitz Date: Mon, 3 Oct 2005 00:54:56 +0000 Subject: SF bug #887946, segfault if redirecting directory Also provide a warning if a directory is passed on the command line. Add minimal command line test. Will backport. --- Lib/test/test_cmd_line.py | 50 +++++++++++++++++++++++++++++++++++++++++++++++ Misc/NEWS | 3 +++ Modules/main.c | 8 ++++++++ Python/sysmodule.c | 9 +++++++++ 4 files changed, 70 insertions(+) create mode 100644 Lib/test/test_cmd_line.py diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py new file mode 100644 index 0000000..fc0c2d2 --- /dev/null +++ b/Lib/test/test_cmd_line.py @@ -0,0 +1,50 @@ + +import test.test_support, unittest +import sys +import popen2 + +class CmdLineTest(unittest.TestCase): + def start_python(self, cmd_line): + outfp, infp = popen2.popen4('%s %s' % (sys.executable, cmd_line)) + infp.close() + data = outfp.read() + outfp.close() + return data + + def test_directories(self): + self.assertTrue('is a directory' in self.start_python('.')) + self.assertTrue('is a directory' in self.start_python('< .')) + + def verify_valid_flag(self, cmd_line): + data = self.start_python(cmd_line) + self.assertTrue(data.endswith('\n')) + self.assertTrue('Traceback' not in data) + + def test_environment(self): + self.verify_valid_flag('-E') + + def test_optimize(self): + self.verify_valid_flag('-O') + self.verify_valid_flag('-OO') + + def test_q(self): + self.verify_valid_flag('-Qold') + self.verify_valid_flag('-Qnew') + self.verify_valid_flag('-Qwarn') + self.verify_valid_flag('-Qwarnall') + + def test_site_flag(self): + self.verify_valid_flag('-S') + + def test_usage(self): + self.assertTrue('usage' in self.start_python('-h')) + + def test_version(self): + version = 'Python %d.%d' % sys.version_info[:2] + self.assertTrue(self.start_python('-V').startswith(version)) + +def test_main(): + test.test_support.run_unittest(CmdLineTest) + +if __name__ == "__main__": + test_main() diff --git a/Misc/NEWS b/Misc/NEWS index bf40e9d..0826013 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,9 @@ What's New in Python 2.5 alpha 1? Core and builtins ----------------- +- SF Bug #887946: fix segfault when redirecting stdin from a directory. + Provide a warning when a directory is passed on the command line. + - Fix segfault with invalid coding. - SF bug #772896: unknown encoding results in MemoryError. diff --git a/Modules/main.c b/Modules/main.c index 1005b94..d511e59 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -359,6 +359,14 @@ Py_Main(int argc, char **argv) } } } + { + /* XXX: does this work on Win/Win64? (see posix_fstat) */ + struct stat sb; + if (fstat(fileno(fp), &sb) == 0 && + S_ISDIR(sb.st_mode)) { + fprintf(stderr, "%s: warning '%s' is a directory\n", argv[0], filename); + } + } } } diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 5a8c7af..0775bb8 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -947,6 +947,15 @@ _PySys_Init(void) m = Py_InitModule3("sys", sys_methods, sys_doc); sysdict = PyModule_GetDict(m); + { + /* XXX: does this work on Win/Win64? (see posix_fstat) */ + struct stat sb; + if (fstat(fileno(stdin), &sb) == 0 && + S_ISDIR(sb.st_mode)) { + Py_FatalError(" is a directory"); + } + } + /* Closing the standard FILE* if sys.std* goes aways causes problems * for embedded Python usages. Closing them when somebody explicitly * invokes .close() might be possible, but the FAQ promises they get -- cgit v0.12