]> granicus.if.org Git - python/commitdiff
bpo-34784: Implement correct cleanup in PyStructSequence new implementation (GH-10536)
authorPablo Galindo <Pablogsal@gmail.com>
Thu, 15 Nov 2018 02:03:57 +0000 (02:03 +0000)
committerGitHub <noreply@github.com>
Thu, 15 Nov 2018 02:03:57 +0000 (02:03 +0000)
PyTuple_Pack can fail and return NULL. If this happens, then PyType_FromSpecWithBases will incorrectly create a new type without bases. Also, it will crash on the Py_DECREF that follows. Also free members and type in error conditions.

Objects/structseq.c

index d5137109f8db57f986757f02281ed7c261e93ff9..05ea87b67a82b3aefe5872b167d3e3c4765030ac 100644 (file)
@@ -447,6 +447,10 @@ PyStructSequence_NewType(PyStructSequence_Desc *desc)
     spec.slots = slots;
 
     bases = PyTuple_Pack(1, &PyTuple_Type);
+    if (bases == NULL) {
+        PyMem_FREE(members);
+        return NULL;
+    }
     type = (PyTypeObject *)PyType_FromSpecWithBases(&spec, bases);
     Py_DECREF(bases);
     PyMem_FREE(members);
@@ -456,6 +460,7 @@ PyStructSequence_NewType(PyStructSequence_Desc *desc)
 
     if (initialize_structseq_dict(
             desc, type->tp_dict, n_members, n_unnamed_members) < 0) {
+        Py_DECREF(type);
         return NULL;
     }