mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
bpo-42412: Fix possible leaks and check arguments in PyType_FromModuleAndSpec() (GH-23410)
* There were leaks if Py_tp_bases is used more than once or if some call is
failed before setting tp_bases.
* There was a crash if the bases argument or the Py_tp_bases slot is not a tuple.
* The documentation was not accurate.
(cherry picked from commit 1db76394ea
)
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
This commit is contained in:
parent
713b4bbd97
commit
d153eb8a1e
2 changed files with 22 additions and 7 deletions
|
@ -2951,26 +2951,40 @@ PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases)
|
|||
base = slot->pfunc;
|
||||
else if (slot->slot == Py_tp_bases) {
|
||||
bases = slot->pfunc;
|
||||
Py_INCREF(bases);
|
||||
}
|
||||
}
|
||||
if (!bases)
|
||||
if (!bases) {
|
||||
bases = PyTuple_Pack(1, base);
|
||||
if (!bases)
|
||||
if (!bases)
|
||||
goto fail;
|
||||
}
|
||||
else if (!PyTuple_Check(bases)) {
|
||||
PyErr_SetString(PyExc_SystemError, "Py_tp_bases is not a tuple");
|
||||
goto fail;
|
||||
}
|
||||
else {
|
||||
Py_INCREF(bases);
|
||||
}
|
||||
}
|
||||
else
|
||||
else if (!PyTuple_Check(bases)) {
|
||||
PyErr_SetString(PyExc_SystemError, "bases is not a tuple");
|
||||
goto fail;
|
||||
}
|
||||
else {
|
||||
Py_INCREF(bases);
|
||||
}
|
||||
|
||||
/* Calculate best base, and check that all bases are type objects */
|
||||
base = best_base(bases);
|
||||
if (base == NULL) {
|
||||
Py_DECREF(bases);
|
||||
goto fail;
|
||||
}
|
||||
if (!_PyType_HasFeature(base, Py_TPFLAGS_BASETYPE)) {
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"type '%.100s' is not an acceptable base type",
|
||||
base->tp_name);
|
||||
Py_DECREF(bases);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
|
@ -2982,7 +2996,6 @@ PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases)
|
|||
type->tp_as_buffer = &res->as_buffer;
|
||||
/* Set tp_base and tp_bases */
|
||||
type->tp_bases = bases;
|
||||
bases = NULL;
|
||||
Py_INCREF(base);
|
||||
type->tp_base = base;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue