Issue #29360: _PyStack_AsDict() doesn't check kwnames

Remove two assertions which can fail on legit code. Keyword arguments are
checked later with better tests and raise a regular (TypeError) exception.
This commit is contained in:
Victor Stinner 2017-01-24 15:05:30 +01:00
parent 90f6332382
commit c3858bd7c6
2 changed files with 10 additions and 8 deletions

View File

@ -166,13 +166,16 @@ PyAPI_FUNC(PyObject*) _PyStack_AsTupleSlice(
Py_ssize_t start,
Py_ssize_t end);
/* Convert keyword arguments from the (stack, kwnames) format to a Python
dictionary.
/* Convert keyword arguments from the FASTCALL (stack: C array, kwnames: tuple)
format to a Python dictionary ("kwargs" dict).
kwnames must only contains str strings, no subclass, and all keys must be
unique. kwnames is not checked, usually these checks are done before or
later calling _PyStack_AsDict(). For example, _PyArg_ParseStackAndKeywords() raises an
error if a key is not a string. */
The type of kwnames keys is not checked. The final function getting
arguments is reponsible to check if all keys are strings, for example using
PyArg_ParseTupleAndKeywords() or PyArg_ValidateKeywordArguments().
Duplicate keys are merged using the last value. If duplicate keys must raise
an exception, the caller is responsible to implement an explicit keys on
kwnames. */
PyAPI_FUNC(PyObject *) _PyStack_AsDict(
PyObject **values,
PyObject *kwnames);

View File

@ -2413,8 +2413,7 @@ _PyStack_AsDict(PyObject **values, PyObject *kwnames)
for (i = 0; i < nkwargs; i++) {
PyObject *key = PyTuple_GET_ITEM(kwnames, i);
PyObject *value = *values++;
assert(PyUnicode_CheckExact(key));
assert(PyDict_GetItem(kwdict, key) == NULL);
/* If key already exists, replace it with the new value */
if (PyDict_SetItem(kwdict, key, value)) {
Py_DECREF(kwdict);
return NULL;