]> granicus.if.org Git - python/commitdiff
ssue #27213: Reintroduce checks in _PyStack_AsDict()
authorVictor Stinner <victor.stinner@gmail.com>
Mon, 12 Sep 2016 10:55:28 +0000 (12:55 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Mon, 12 Sep 2016 10:55:28 +0000 (12:55 +0200)
Include/abstract.h
Objects/abstract.c
Objects/methodobject.c

index a94ce660c05f01c6f68309e8d54bb4e5733405e8..87483677fdff8a02529d42ef4480d48749a505a2 100644 (file)
@@ -275,7 +275,9 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
 
     PyAPI_FUNC(PyObject *) _PyStack_AsDict(
         PyObject **values,
-        PyObject *kwnames);
+        Py_ssize_t nkwargs,
+        PyObject *kwnames,
+        PyObject *func);
 
     /* Convert (args, nargs, kwargs) into a (stack, nargs, kwnames).
 
index a929be9fe6bcefcbd27fe859771bff51e303e593..f9e5009f78a0862725d81a5260cb26c84189e176 100644 (file)
@@ -2367,9 +2367,9 @@ _PyObject_Call_Prepend(PyObject *func,
 }
 
 PyObject *
-_PyStack_AsDict(PyObject **values, PyObject *kwnames)
+_PyStack_AsDict(PyObject **values, Py_ssize_t nkwargs, PyObject *kwnames,
+                PyObject *func)
 {
-    Py_ssize_t nkwargs = PyTuple_GET_SIZE(kwnames);
     PyObject *kwdict;
     Py_ssize_t i;
 
@@ -2378,12 +2378,24 @@ _PyStack_AsDict(PyObject **values, PyObject *kwnames)
         return NULL;
     }
 
-    for (i = 0; i < nkwargs; i++) {
+    for (i=0; i < nkwargs; i++) {
+        int err;
         PyObject *key = PyTuple_GET_ITEM(kwnames, i);
         PyObject *value = *values++;
-        assert(PyUnicode_CheckExact(key));
-        assert(PyDict_GetItem(kwdict, key) == NULL);
-        if (PyDict_SetItem(kwdict, key, value)) {
+
+        if (PyDict_GetItem(kwdict, key) != NULL) {
+            PyErr_Format(PyExc_TypeError,
+                         "%.200s%s got multiple values "
+                         "for keyword argument '%U'",
+                         PyEval_GetFuncName(func),
+                         PyEval_GetFuncDesc(func),
+                         key);
+            Py_DECREF(kwdict);
+            return NULL;
+        }
+
+        err = PyDict_SetItem(kwdict, key, value);
+        if (err) {
             Py_DECREF(kwdict);
             return NULL;
         }
@@ -2467,7 +2479,7 @@ _PyObject_FastCallKeywords(PyObject *func, PyObject **stack, Py_ssize_t nargs,
     }
 
     if (nkwargs > 0) {
-        kwdict = _PyStack_AsDict(stack + nargs, kwnames);
+        kwdict = _PyStack_AsDict(stack + nargs, nkwargs, kwnames, func);
         if (kwdict == NULL) {
             return NULL;
         }
index 90c473ee9713841e7ecfdc290472a9b939a5b72f..487ccd7a3008a285e6352415628a538bea9f735c 100644 (file)
@@ -279,7 +279,7 @@ _PyCFunction_FastCallKeywords(PyObject *func, PyObject **stack,
 
     nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames);
     if (nkwargs > 0) {
-        kwdict = _PyStack_AsDict(stack + nargs, kwnames);
+        kwdict = _PyStack_AsDict(stack + nargs, nkwargs, kwnames, func);
         if (kwdict == NULL) {
             return NULL;
         }