]> granicus.if.org Git - python/commitdiff
Issue #29327: Fixed a crash when pass the iterable keyword argument to sorted().
authorSerhiy Storchaka <storchaka@gmail.com>
Fri, 20 Jan 2017 06:33:06 +0000 (08:33 +0200)
committerSerhiy Storchaka <storchaka@gmail.com>
Fri, 20 Jan 2017 06:33:06 +0000 (08:33 +0200)
Lib/test/test_builtin.py
Misc/NEWS
Python/bltinmodule.c

index a792099f10a48ee79e38e7ec15de3446791453f5..416316c02852c82ef3b156ea413f1da16648d17d 100644 (file)
@@ -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]
index dfb42b681a4ed05546cfb98faa55cbe0fa45f39c..138539b41877247bf1d8a3e775cbd0f96225913e 100644 (file)
--- 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.
index 69e5f08b0ee62bd458c6957ff6e23bd3c54cb963..8acdfc3222b2ccdc7ff3798694b766bdc77e1b67 100644 (file)
@@ -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);