summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2017-01-20 06:33:06 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2017-01-20 06:33:06 (GMT)
commit398ef5c08feabfdbf7d0b1e10817139f0e98eefd (patch)
tree313bc8288fb071b96270f05ce96bf19cc13f1358
parenta57a8a3e2d64dfff1bc843c8b34a6a5e06dbe595 (diff)
downloadcpython-398ef5c08feabfdbf7d0b1e10817139f0e98eefd.zip
cpython-398ef5c08feabfdbf7d0b1e10817139f0e98eefd.tar.gz
cpython-398ef5c08feabfdbf7d0b1e10817139f0e98eefd.tar.bz2
Issue #29327: Fixed a crash when pass the iterable keyword argument to sorted().
-rw-r--r--Lib/test/test_builtin.py10
-rw-r--r--Misc/NEWS3
-rw-r--r--Python/bltinmodule.c3
3 files changed, 15 insertions, 1 deletions
diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py
index a792099..416316c 100644
--- a/Lib/test/test_builtin.py
+++ b/Lib/test/test_builtin.py
@@ -1627,6 +1627,16 @@ class TestSorted(unittest.TestCase):
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 --git a/Misc/NEWS b/Misc/NEWS
index dfb42b6..138539b 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@ What's New in Python 3.6.1 release candidate 1?
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 --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 69e5f08..8acdfc3 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -2123,7 +2123,7 @@ builtin_sorted(PyObject *self, PyObject *args, PyObject *kwds)
{
PyObject *newlist, *v, *seq, *keyfunc=NULL, **newargs;
PyObject *callable;
- static char *kwlist[] = {"iterable", "key", "reverse", 0};
+ static char *kwlist[] = {"", "key", "reverse", 0};
int reverse;
Py_ssize_t nargs;
@@ -2142,6 +2142,7 @@ builtin_sorted(PyObject *self, PyObject *args, PyObject *kwds)
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);