changeset: 106246:f44f44b14dfc parent: 106244:cb6d4df2bd9b parent: 106245:1827b64cfce8 user: Serhiy Storchaka date: Fri Jan 20 08:35:18 2017 +0200 files: Misc/NEWS Python/bltinmodule.c description: Issue #29327: Fixed a crash when pass the iterable keyword argument to sorted(). diff -r cb6d4df2bd9b -r f44f44b14dfc Lib/test/test_builtin.py --- a/Lib/test/test_builtin.py Thu Jan 19 21:39:55 2017 -0800 +++ b/Lib/test/test_builtin.py Fri Jan 20 08:35:18 2017 +0200 @@ -1627,6 +1627,16 @@ self.assertEqual(data, sorted(copy, reverse=1)) self.assertNotEqual(data, copy) + def test_bad_arguments(self): + # Issue #29327: The first argument is positional-only. + sorted([]) + with self.assertRaises(TypeError): + sorted(iterable=[]) + # Other arguments are keyword-only + sorted([], key=None) + with self.assertRaises(TypeError): + sorted([], None) + def test_inputtypes(self): s = 'abracadabra' types = [list, tuple, str] diff -r cb6d4df2bd9b -r f44f44b14dfc Misc/NEWS --- a/Misc/NEWS Thu Jan 19 21:39:55 2017 -0800 +++ b/Misc/NEWS Fri Jan 20 08:35:18 2017 +0200 @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #29327: Fixed a crash when pass the iterable keyword argument to + sorted(). + - Issue #29034: Fix memory leak and use-after-free in os module (path_converter). - Issue #29159: Fix regression in bytes(x) when x.__index__() raises Exception. diff -r cb6d4df2bd9b -r f44f44b14dfc Python/bltinmodule.c --- a/Python/bltinmodule.c Thu Jan 19 21:39:55 2017 -0800 +++ b/Python/bltinmodule.c Fri Jan 20 08:35:18 2017 +0200 @@ -2128,7 +2128,7 @@ { PyObject *newlist, *v, *seq, *keyfunc=NULL; PyObject *callable; - static const char * const kwlist[] = {"iterable", "key", "reverse", 0}; + static const char * const kwlist[] = {"", "key", "reverse", 0}; /* args 1-3 should match listsort in Objects/listobject.c */ static _PyArg_Parser parser = {"O|Oi:sorted", kwlist, 0}; int reverse; @@ -2147,6 +2147,7 @@ return NULL; } + assert(nargs >= 1); v = _PyObject_FastCallKeywords(callable, args + 1, nargs - 1, kwnames); Py_DECREF(callable); if (v == NULL) {