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:
parent
90f6332382
commit
c3858bd7c6
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue