]> granicus.if.org Git - python/commitdiff
SF bug #887946, segfault if redirecting directory
authorNeal Norwitz <nnorwitz@gmail.com>
Mon, 3 Oct 2005 00:54:56 +0000 (00:54 +0000)
committerNeal Norwitz <nnorwitz@gmail.com>
Mon, 3 Oct 2005 00:54:56 +0000 (00:54 +0000)
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 [new file with mode: 0644]
Misc/NEWS
Modules/main.c
Python/sysmodule.c

diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py
new file mode 100644 (file)
index 0000000..fc0c2d2
--- /dev/null
@@ -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()
index bf40e9de0a5026274c18f4dcc9be2e4a9f34be4a..0826013ef6793d3772cdd168366591bb9775f16e 100644 (file)
--- 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.
index 1005b94e224935641a3e789bb1766144fecf8725..d511e59763d82d309af2465073b151771faef978 100644 (file)
@@ -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);
+                               }
+                       }
                }
        }
 
index 5a8c7af98a6476185c021e1b0503bafa2ad600ee..0775bb83c614987f7247884393cba3cf0e5e6fbe 100644 (file)
@@ -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