From d0202817b336ca9840a1563c0fe9cdbd14b31c2a Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Wed, 14 Nov 2018 01:01:46 +0000 Subject: [PATCH 1/2] bpo-34784: Prevent creating types without bases on PyTuple_Pack failure --- Objects/structseq.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Objects/structseq.c b/Objects/structseq.c index d5137109f8db57f..93bf5ceeb4108df 100644 --- a/Objects/structseq.c +++ b/Objects/structseq.c @@ -447,6 +447,9 @@ PyStructSequence_NewType(PyStructSequence_Desc *desc) spec.slots = slots; bases = PyTuple_Pack(1, &PyTuple_Type); + if (bases == NULL) { + return NULL; + } type = (PyTypeObject *)PyType_FromSpecWithBases(&spec, bases); Py_DECREF(bases); PyMem_FREE(members); From 3c0b2b25e6b17b3c04183b0a57dc3dce9ac4ba15 Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Wed, 14 Nov 2018 10:56:27 +0100 Subject: [PATCH 2/2] Also free members and type in error conditions --- Objects/structseq.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Objects/structseq.c b/Objects/structseq.c index 93bf5ceeb4108df..05ea87b67a82b3a 100644 --- a/Objects/structseq.c +++ b/Objects/structseq.c @@ -448,6 +448,7 @@ PyStructSequence_NewType(PyStructSequence_Desc *desc) bases = PyTuple_Pack(1, &PyTuple_Type); if (bases == NULL) { + PyMem_FREE(members); return NULL; } type = (PyTypeObject *)PyType_FromSpecWithBases(&spec, bases); @@ -459,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; }