From 6baded49d0abf07f141dae489c6a010af1b1e209 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 17 May 2010 01:13:37 +0000 Subject: Issue #6697: Fix a crash if code of "python -c code" contains surrogates --- Lib/test/test_sys.py | 18 ++++++++++++++++++ Modules/main.c | 12 ++++++++---- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index a9f3f5e..abbd759 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -449,6 +449,24 @@ class SysModuleTest(unittest.TestCase): self.assertRaises(TypeError, sys.intern, S("abc")) + def test_main_invalid_unicode(self): + import locale + non_decodable = b"\xff" + encoding = locale.getpreferredencoding() + try: + non_decodable.decode(encoding) + except UnicodeDecodeError: + pass + else: + self.skipTest('%r is decodable with encoding %s' + % (non_decodable, encoding)) + code = b'print("' + non_decodable + b'")' + p = subprocess.Popen([sys.executable, "-c", code], stderr=subprocess.PIPE) + stdout, stderr = p.communicate() + self.assertEqual(p.returncode, 1) + self.assert_(stderr.startswith(b"UnicodeEncodeError: " + b"'utf-8' codec can't encode character '\\udcff' in " + b"position 7: surrogates not allowed"), stderr) def test_sys_flags(self): self.assertTrue(sys.flags) diff --git a/Modules/main.c b/Modules/main.c index 32139f6..92b971f 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -563,18 +563,22 @@ Py_Main(int argc, wchar_t **argv) } if (command) { + char *commandStr; PyObject *commandObj = PyUnicode_FromWideChar( command, wcslen(command)); free(command); - if (commandObj != NULL) { - sts = PyRun_SimpleStringFlags( - _PyUnicode_AsString(commandObj), &cf) != 0; + if (commandObj != NULL) + commandStr = _PyUnicode_AsString(commandObj); + else + commandStr = NULL; + if (commandStr != NULL) { + sts = PyRun_SimpleStringFlags(commandStr, &cf) != 0; + Py_DECREF(commandObj); } else { PyErr_Print(); sts = 1; } - Py_DECREF(commandObj); } else if (module) { sts = RunModule(module, 1); } -- cgit v0.12