[Python-checkins] r81250 - in python/branches/py3k: Lib/test/test_sys.py Modules/main.c
victor.stinner
python-checkins at python.org
Mon May 17 03:13:37 CEST 2010
Author: victor.stinner
Date: Mon May 17 03:13:37 2010
New Revision: 81250
Log:
Issue #6697: Fix a crash if code of "python -c code" contains surrogates
Modified:
python/branches/py3k/Lib/test/test_sys.py
python/branches/py3k/Modules/main.c
Modified: python/branches/py3k/Lib/test/test_sys.py
==============================================================================
--- python/branches/py3k/Lib/test/test_sys.py (original)
+++ python/branches/py3k/Lib/test/test_sys.py Mon May 17 03:13:37 2010
@@ -449,6 +449,24 @@
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)
Modified: python/branches/py3k/Modules/main.c
==============================================================================
--- python/branches/py3k/Modules/main.c (original)
+++ python/branches/py3k/Modules/main.c Mon May 17 03:13:37 2010
@@ -563,18 +563,22 @@
}
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);
}
More information about the Python-checkins
mailing list