From c3bbfe34baf9067b59d6823ac2cab0f3996b5600 Mon Sep 17 00:00:00 2001 From: Alexey Izbyshev Date: Sat, 25 Aug 2018 21:36:24 +0300 Subject: [PATCH] bpo-34501: PyType_FromSpecWithBases: Check spec->name before dereferencing it Reported by Svace static analyzer. --- Objects/typeobject.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Objects/typeobject.c b/Objects/typeobject.c index af9685d17d5f65..52fcfeb2287188 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) {