]> granicus.if.org Git - python/commitdiff
#3705: Fix crash when given a non-ascii value on the command line for the "-c" and...
authorAmaury Forgeot d'Arc <amauryfa@gmail.com>
Tue, 9 Sep 2008 07:04:36 +0000 (07:04 +0000)
committerAmaury Forgeot d'Arc <amauryfa@gmail.com>
Tue, 9 Sep 2008 07:04:36 +0000 (07:04 +0000)
Second part, for Windows.

Reviewed by Antoine Pitrou

Lib/test/test_cmd_line.py
Misc/NEWS
Modules/main.c
Python/import.c

index d63dfa19f9dbd1749770670fad3dddd62c1158e5..fc0e3a728a649d6c0ddedc6fd141ddf8659c0a15 100644 (file)
@@ -135,6 +135,12 @@ class CmdLineTest(unittest.TestCase):
             self.exit_code('-c', 'pass'),
             0)
 
+        # Test handling of non-ascii data
+        command = "assert(ord('\xe9') == 0xe9)"
+        self.assertEqual(
+            self.exit_code('-c', command),
+            0)
+
 
 def test_main():
     test.support.run_unittest(CmdLineTest)
index 1dd15d6cf25f0a3aa10df143bfd2bed8216ad883..5eaf640633a08b48652cfa793b6254fcb314ef24 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -13,8 +13,7 @@ Core and Builtins
 -----------------
 
 - Issue #3705: fix crash when given a non-ascii value on the command line for
-  the "-c" and "-m" parameters. Now the behaviour is as expected under Linux,
-  although under Windows it fails at a later point.
+  the "-c" and "-m" parameters.
 
 - Issue #3279: Importing site at interpreter was failing silently because the
   site module uses the open builtin which was not initialized at the time.
index 5a84cc22bcc5089a837ee8a7dc9d11a60c6b1ac5..2148ccca4774e20b07760525074f312f876f26cf 100644 (file)
@@ -287,7 +287,7 @@ Py_Main(int argc, wchar_t **argv)
 {
        int c;
        int sts;
-       char *command = NULL;
+       wchar_t *command = NULL;
        wchar_t *filename = NULL;
        wchar_t *module = NULL;
        FILE *fp = stdin;
@@ -299,7 +299,6 @@ Py_Main(int argc, wchar_t **argv)
        int version = 0;
        int saw_unbuffered_flag = 0;
        PyCompilerFlags cf;
-       char *oldloc;
 
        cf.cf_flags = 0;
 
@@ -310,30 +309,19 @@ Py_Main(int argc, wchar_t **argv)
 
        while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
                if (c == 'c') {
-                       size_t r1, r2;
-                       oldloc = setlocale(LC_ALL, NULL);
-                       setlocale(LC_ALL, "");
-                       r1 = wcslen(_PyOS_optarg);
-                       r2 = wcstombs(NULL, _PyOS_optarg, r1);
-                       if (r2 == (size_t) -1)
-                               Py_FatalError(
-                                  "cannot convert character encoding of -c argument");
-                       if (r2 > r1)
-                               r1 = r2;
-                       r1 += 2;
+                       size_t len;
                        /* -c is the last option; following arguments
                           that look like options are left for the
                           command to interpret. */
-                       command = (char *)malloc(r1);
+
+                       len = wcslen(_PyOS_optarg) + 1 + 1;
+                       command = (wchar_t *)malloc(sizeof(wchar_t) * len);
                        if (command == NULL)
                                Py_FatalError(
                                   "not enough memory to copy -c argument");
-                       r2 = wcstombs(command, _PyOS_optarg, r1);
-                       if (r2 > r1-1)
-                               Py_FatalError(
-                                   "not enough memory to copy -c argument");
-                       strcat(command, "\n");
-                       setlocale(LC_ALL, oldloc);
+                       wcscpy(command, _PyOS_optarg);
+                       command[len - 2] = '\n';
+                       command[len - 1] = 0;
                        break;
                }
 
@@ -543,8 +531,18 @@ Py_Main(int argc, wchar_t **argv)
        }
 
        if (command) {
-               sts = PyRun_SimpleStringFlags(command, &cf) != 0;
+               PyObject *commandObj = PyUnicode_FromUnicode(
+                                          command, wcslen(command));
                free(command);
+               if (commandObj != NULL) {
+                       sts = PyRun_SimpleStringFlags(
+                               _PyUnicode_AsString(commandObj), &cf) != 0;
+               }
+               else {
+                       PyErr_Print();
+                       sts = 1;
+               }
+               Py_DECREF(commandObj);
        } else if (module) {
                sts = RunModule(module, 1);
        }
index 9c077fe8a66dd7865a1fde6136d7bd4dcb36fd41..13e46ad9a9506d3524d54054e70a2d37d916290a 100644 (file)
@@ -2804,6 +2804,7 @@ call_find_module(char *name, PyObject *path)
 {
        extern int fclose(FILE *);
        PyObject *fob, *ret;
+       PyObject *pathobj;
        struct filedescr *fdp;
        char pathname[MAXPATHLEN+1];
        FILE *fp = NULL;
@@ -2847,9 +2848,9 @@ call_find_module(char *name, PyObject *path)
                fob = Py_None;
                Py_INCREF(fob);
        }
-       ret = Py_BuildValue("Os(ssi)",
-                     fob, pathname, fdp->suffix, fdp->mode, fdp->type);
-       Py_DECREF(fob);
+       pathobj = PyUnicode_DecodeFSDefault(pathname);
+       ret = Py_BuildValue("NN(ssi)",
+                     fob, pathobj, fdp->suffix, fdp->mode, fdp->type);
        PyMem_FREE(found_encoding);
 
        return ret;
@@ -2860,7 +2861,9 @@ imp_find_module(PyObject *self, PyObject *args)
 {
        char *name;
        PyObject *path = NULL;
-       if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
+       if (!PyArg_ParseTuple(args, "es|O:find_module", 
+                                 Py_FileSystemDefaultEncoding, &name, 
+                                                 &path))
                return NULL;
        return call_find_module(name, path);
 }