From: Serhiy Storchaka Date: Fri, 20 Jan 2017 06:35:18 +0000 (+0200) Subject: Issue #29327: Fixed a crash when pass the iterable keyword argument to sorted(). X-Git-Tag: v3.7.0a1~1499 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=299dc239fe79b06a7a270d0d9e3208f66f69d5b3;p=python Issue #29327: Fixed a crash when pass the iterable keyword argument to sorted(). --- 299dc239fe79b06a7a270d0d9e3208f66f69d5b3 diff --cc Python/bltinmodule.c index ab029ce0aa,8acdfc3222..6df8af4733 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@@ -2121,20 -2116,20 +2121,20 @@@ PyDoc_STRVAR(builtin_sorted__doc__ "reverse flag can be set to request the result in descending order."); #define BUILTIN_SORTED_METHODDEF \ - {"sorted", (PyCFunction)builtin_sorted, METH_VARARGS|METH_KEYWORDS, builtin_sorted__doc__}, + {"sorted", (PyCFunction)builtin_sorted, METH_FASTCALL, builtin_sorted__doc__}, static PyObject * -builtin_sorted(PyObject *self, PyObject *args, PyObject *kwds) +builtin_sorted(PyObject *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames) { - PyObject *newlist, *v, *seq, *keyfunc=NULL, **newargs; + PyObject *newlist, *v, *seq, *keyfunc=NULL; PyObject *callable; - static const char * const kwlist[] = {"iterable", "key", "reverse", 0}; - static char *kwlist[] = {"", "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; - Py_ssize_t nargs; - /* args 1-3 should match listsort in Objects/listobject.c */ - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|Oi:sorted", - kwlist, &seq, &keyfunc, &reverse)) + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &parser, + &seq, &keyfunc, &reverse)) return NULL; newlist = PySequence_List(seq); @@@ -2147,7 -2142,10 +2147,8 @@@ return NULL; } - assert(PyTuple_GET_SIZE(args) >= 1); - newargs = &PyTuple_GET_ITEM(args, 1); - nargs = PyTuple_GET_SIZE(args) - 1; - v = _PyObject_FastCallDict(callable, newargs, nargs, kwds); ++ assert(nargs >= 1); + v = _PyObject_FastCallKeywords(callable, args + 1, nargs - 1, kwnames); Py_DECREF(callable); if (v == NULL) { Py_DECREF(newlist);