diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2017-01-24 14:05:30 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2017-01-24 14:05:30 (GMT) |
commit | c3858bd7c6e6ef37978b8483a9fe594f29b4b2de (patch) | |
tree | 0725e4f21874d89776a14be75c9104e64617413f | |
parent | 90f6332382d616ce5a3329c1176ffa1cff27ea7e (diff) | |
download | cpython-c3858bd7c6e6ef37978b8483a9fe594f29b4b2de.zip cpython-c3858bd7c6e6ef37978b8483a9fe594f29b4b2de.tar.gz cpython-c3858bd7c6e6ef37978b8483a9fe594f29b4b2de.tar.bz2 |
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.
-rw-r--r-- | Include/abstract.h | 15 | ||||
-rw-r--r-- | Objects/abstract.c | 3 |
2 files changed, 10 insertions, 8 deletions
diff --git a/Include/abstract.h b/Include/abstract.h index 6647be7..231e209 100644 --- a/Include/abstract.h +++ b/Include/abstract.h @@ -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); diff --git a/Objects/abstract.c b/Objects/abstract.c index 5864032..1e394f8 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -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; |