]> granicus.if.org Git - python/commitdiff
bpo-29684: Fix minor regression of PyEval_CallObjectWithKeywords. (GH-378)
authorINADA Naoki <methane@users.noreply.github.com>
Wed, 1 Mar 2017 12:14:43 +0000 (21:14 +0900)
committerGitHub <noreply@github.com>
Wed, 1 Mar 2017 12:14:43 +0000 (21:14 +0900)
Misc/NEWS
Python/ceval.c

index fe420b62f231ddce1399922cd1cdabc8d38d7283..33559a7abb8ce1d3cd5d6d61a78abba0df490837 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,10 @@ What's New in Python 3.6.1 release candidate 1?
 Core and Builtins
 -----------------
 
+- bpo-29684: Fix minor regression of PyEval_CallObjectWithKeywords.
+  It should raise TypeError when kwargs is not a dict.  But it might
+  cause segv when args=NULL and kwargs is not a dict.
+
 - Issue #28598: Support __rmod__ for subclasses of str being called before
   str.__mod__.  Patch by Martijn Pieters.
 
index 83667353af232c10130fba1045367de62fc02fbf..02bc67ef71090a795cdb6e063159b36f148d425c 100644 (file)
@@ -4699,11 +4699,7 @@ PyEval_CallObjectWithKeywords(PyObject *func, PyObject *args, PyObject *kwargs)
     assert(!PyErr_Occurred());
 #endif
 
-    if (args == NULL) {
-        return _PyObject_FastCallDict(func, NULL, 0, kwargs);
-    }
-
-    if (!PyTuple_Check(args)) {
+    if (args != NULL && !PyTuple_Check(args)) {
         PyErr_SetString(PyExc_TypeError,
                         "argument list must be a tuple");
         return NULL;
@@ -4715,7 +4711,12 @@ PyEval_CallObjectWithKeywords(PyObject *func, PyObject *args, PyObject *kwargs)
         return NULL;
     }
 
-    return PyObject_Call(func, args, kwargs);
+    if (args == NULL) {
+        return _PyObject_FastCallDict(func, NULL, 0, kwargs);
+    }
+    else {
+        return PyObject_Call(func, args, kwargs);
+    }
 }
 
 const char *