From 64f3ca4206ebcb4b3166e0cd8fe0658628b04b4e Mon Sep 17 00:00:00 2001 From: Amaury Forgeot d'Arc Date: Tue, 1 Dec 2009 21:59:18 +0000 Subject: Merged revisions 76625 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ........ r76625 | amaury.forgeotdarc | 2009-12-01 22:51:04 +0100 (mar., 01 déc. 2009) | 3 lines #7419: Fix a crash on Windows in locale.setlocale() when the category is outside the allowed range. ........ --- Lib/test/test_locale.py | 11 +++++++++++ Misc/NEWS | 3 +++ Modules/_localemodule.c | 8 ++++++++ 3 files changed, 22 insertions(+) diff --git a/Lib/test/test_locale.py b/Lib/test/test_locale.py index 8dfaf90..8c17f87 100644 --- a/Lib/test/test_locale.py +++ b/Lib/test/test_locale.py @@ -353,6 +353,17 @@ class TestMiscellaneous(unittest.TestCase): self.assertRaises(TypeError, locale.strcoll, "a", None) self.assertRaises(TypeError, locale.strcoll, b"a", None) + def test_setlocale_category(self): + locale.setlocale(locale.LC_ALL) + locale.setlocale(locale.LC_TIME) + locale.setlocale(locale.LC_CTYPE) + locale.setlocale(locale.LC_COLLATE) + locale.setlocale(locale.LC_MONETARY) + locale.setlocale(locale.LC_NUMERIC) + + # crasher from bug #7419 + self.assertRaises(locale.Error, locale.setlocale, 12345) + def test_main(): tests = [ diff --git a/Misc/NEWS b/Misc/NEWS index d3da7b9..46a5912 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,9 @@ What's New in Python 3.2 Alpha 1? Core and Builtins ----------------- +- Issue #7419: setlocale() could crash the interpreter on Windows when called + with invalid values. + - Issue #6077: On Windows, files opened with tempfile.TemporaryFile in "wt+" mode would appear truncated on the first '0x1a' byte (aka. Ctrl+Z). diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c index fa6ab8f..aabc3ac 100644 --- a/Modules/_localemodule.c +++ b/Modules/_localemodule.c @@ -133,6 +133,14 @@ PyLocale_setlocale(PyObject* self, PyObject* args) if (!PyArg_ParseTuple(args, "i|z:setlocale", &category, &locale)) return NULL; +#if defined(MS_WINDOWS) + if (category < LC_MIN || category > LC_MAX) + { + PyErr_SetString(Error, "invalid locale category"); + return NULL; + } +#endif + if (locale) { /* set locale */ result = setlocale(category, locale); -- cgit v0.12