From: Amaury Forgeot d'Arc Date: Tue, 1 Dec 2009 21:51:04 +0000 (+0000) Subject: #7419: Fix a crash on Windows in locale.setlocale() when the category X-Git-Tag: v2.7a1~16 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d728871ee170604e18dd8e0bf1b28b6520a5b809;p=python #7419: Fix a crash on Windows in locale.setlocale() when the category is outside the allowed range. --- diff --git a/Lib/test/test_locale.py b/Lib/test/test_locale.py index d9d3cd95dc..451040977a 100644 --- a/Lib/test/test_locale.py +++ b/Lib/test/test_locale.py @@ -360,6 +360,17 @@ class TestMiscellaneous(unittest.TestCase): # test crasher from bug #3303 self.assertRaises(TypeError, locale.strcoll, u"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 8ac7c24fcc..a8b56e275c 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,10 +12,13 @@ What's New in Python 2.7 alpha 1 Core and Builtins ----------------- +- Issue #7419: setlocale() could crash the interpreter on Windows when called + with invalid values. + - Issue #3382: 'F' formatting for float and complex now convert the result to upper case. This only affects 'inf' and 'nan', since 'f' no longer converts to 'g' for large values. - + - Remove switch from "%f" formatting to "%g" formatting for floats larger than 1e50 in absolute value. diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c index 94d0014bbc..f1f4abff3e 100644 --- a/Modules/_localemodule.c +++ b/Modules/_localemodule.c @@ -163,6 +163,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);