diff options
author | Alexey Izbyshev <izbyshev@ispras.ru> | 2018-08-25 18:53:47 (GMT) |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2018-08-25 18:53:47 (GMT) |
commit | 5f79b50763d687aeeed8edcb4efcc7ac9f8fa186 (patch) | |
tree | d2c2979ffb9673ff3b1dccd19e978f3ba2df54a7 /Objects | |
parent | 44838be9f79870ff3c9e04b7398a1dc3d56d53ed (diff) | |
download | cpython-5f79b50763d687aeeed8edcb4efcc7ac9f8fa186.zip cpython-5f79b50763d687aeeed8edcb4efcc7ac9f8fa186.tar.gz cpython-5f79b50763d687aeeed8edcb4efcc7ac9f8fa186.tar.bz2 |
closes bpo-34501: PyType_FromSpecWithBases: Check spec->name before dereferencing it. (GH-8930)
Reported by Svace static analyzer.
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/typeobject.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/Objects/typeobject.c b/Objects/typeobject.c index af9685d..52fcfeb 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -2847,6 +2847,15 @@ PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) char *res_start = (char*)res; PyType_Slot *slot; + if (res == NULL) + return NULL; + + if (spec->name == NULL) { + PyErr_SetString(PyExc_SystemError, + "Type spec does not define the name field."); + goto fail; + } + /* Set the type name and qualname */ s = strrchr(spec->name, '.'); if (s == NULL) @@ -2854,8 +2863,6 @@ PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) else s++; - if (res == NULL) - return NULL; type = &res->ht_type; /* The flags must be initialized early, before the GC traverses us */ type->tp_flags = spec->flags | Py_TPFLAGS_HEAPTYPE; @@ -2865,8 +2872,6 @@ PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) res->ht_qualname = res->ht_name; Py_INCREF(res->ht_qualname); type->tp_name = spec->name; - if (!type->tp_name) - goto fail; /* Adjust for empty tuple bases */ if (!bases) { |