]> granicus.if.org Git - python/commitdiff
closes bpo-34501: PyType_FromSpecWithBases: Check spec->name before dereferencing...
authorAlexey Izbyshev <izbyshev@ispras.ru>
Sat, 25 Aug 2018 18:53:47 +0000 (21:53 +0300)
committerBenjamin Peterson <benjamin@python.org>
Sat, 25 Aug 2018 18:53:47 +0000 (11:53 -0700)
Reported by Svace static analyzer.

Objects/typeobject.c

index af9685d17d5f6504ad38f053ad54c5a01385c5ed..52fcfeb22871885c1587462f264db0b496f5247e 100644 (file)
@@ -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) {