diff options
author | Neal Norwitz <nnorwitz@gmail.com> | 2005-10-03 00:54:56 (GMT) |
---|---|---|
committer | Neal Norwitz <nnorwitz@gmail.com> | 2005-10-03 00:54:56 (GMT) |
commit | 11bd11922657f582ee05f1d3cefe32c3a9e51cb7 (patch) | |
tree | 4dfa13e8f81174dbd90bf28a44a5cc1b0c611685 | |
parent | d157b1d237776f0ee044b97b19b1d803a353f096 (diff) | |
download | cpython-11bd11922657f582ee05f1d3cefe32c3a9e51cb7.zip cpython-11bd11922657f582ee05f1d3cefe32c3a9e51cb7.tar.gz cpython-11bd11922657f582ee05f1d3cefe32c3a9e51cb7.tar.bz2 |
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.
-rw-r--r-- | Lib/test/test_cmd_line.py | 50 | ||||
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Modules/main.c | 8 | ||||
-rw-r--r-- | Python/sysmodule.c | 9 |
4 files changed, 70 insertions, 0 deletions
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() @@ -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("<stdin> 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 |