[3.8] bpo-36290: Fix keyword collision handling in AST node constructors (GH-12382) by miss-islington · Pull Request #20366 · python/cpython

Expand Up @@ -665,8 +665,9 @@ def visitModule(self, mod): } if (fields) { numfields = PySequence_Size(fields); if (numfields == -1) if (numfields == -1) { goto cleanup; } }
res = 0; /* if no error occurs, this stays 0 to the end */ Expand All @@ -687,15 +688,35 @@ def visitModule(self, mod): } res = PyObject_SetAttr(self, name, PyTuple_GET_ITEM(args, i)); Py_DECREF(name); if (res < 0) if (res < 0) { goto cleanup; } } if (kw) { i = 0; /* needed by PyDict_Next */ while (PyDict_Next(kw, &i, &key, &value)) { int contains = PySequence_Contains(fields, key); if (contains == -1) { res = -1; goto cleanup; } else if (contains == 1) { Py_ssize_t p = PySequence_Index(fields, key); if (p == -1) { res = -1; goto cleanup; } if (p < PyTuple_GET_SIZE(args)) { PyErr_Format(PyExc_TypeError, "%.400s got multiple values for argument '%U'", Py_TYPE(self)->tp_name, key); res = -1; goto cleanup; } } res = PyObject_SetAttr(self, key, value); if (res < 0) if (res < 0) { goto cleanup; } } } cleanup: Expand Down