Kaydet (Commit) d728871e authored tarafından Amaury Forgeot d'Arc's avatar Amaury Forgeot d'Arc

#7419: Fix a crash on Windows in locale.setlocale() when the category

is outside the allowed range.
üst 7072f74d
...@@ -360,6 +360,17 @@ class TestMiscellaneous(unittest.TestCase): ...@@ -360,6 +360,17 @@ class TestMiscellaneous(unittest.TestCase):
# test crasher from bug #3303 # test crasher from bug #3303
self.assertRaises(TypeError, locale.strcoll, u"a", None) 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(): def test_main():
tests = [ tests = [
......
...@@ -12,10 +12,13 @@ What's New in Python 2.7 alpha 1 ...@@ -12,10 +12,13 @@ What's New in Python 2.7 alpha 1
Core and Builtins 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 - Issue #3382: 'F' formatting for float and complex now convert the
result to upper case. This only affects 'inf' and 'nan', since 'f' result to upper case. This only affects 'inf' and 'nan', since 'f'
no longer converts to 'g' for large values. no longer converts to 'g' for large values.
- Remove switch from "%f" formatting to "%g" formatting for floats - Remove switch from "%f" formatting to "%g" formatting for floats
larger than 1e50 in absolute value. larger than 1e50 in absolute value.
......
...@@ -163,6 +163,14 @@ PyLocale_setlocale(PyObject* self, PyObject* args) ...@@ -163,6 +163,14 @@ PyLocale_setlocale(PyObject* self, PyObject* args)
if (!PyArg_ParseTuple(args, "i|z:setlocale", &category, &locale)) if (!PyArg_ParseTuple(args, "i|z:setlocale", &category, &locale))
return NULL; return NULL;
#if defined(MS_WINDOWS)
if (category < LC_MIN || category > LC_MAX)
{
PyErr_SetString(Error, "invalid locale category");
return NULL;
}
#endif
if (locale) { if (locale) {
/* set locale */ /* set locale */
result = setlocale(category, locale); result = setlocale(category, locale);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment