bpo-44856: Possible reference leak in error paths of update_bases() a… · python/cpython@ed718e9

@@ -71,6 +71,7 @@ update_bases(PyObject *bases, PyObject *const *args, Py_ssize_t nargs)

7171

/* If this is a first successful replacement, create new_bases list and

7272

copy previously encountered bases. */

7373

if (!(new_bases = PyList_New(i))) {

74+

Py_DECREF(new_base);

7475

goto error;

7576

}

7677

for (j = 0; j < i; j++) {

@@ -81,6 +82,7 @@ update_bases(PyObject *bases, PyObject *const *args, Py_ssize_t nargs)

8182

}

8283

j = PyList_GET_SIZE(new_bases);

8384

if (PyList_SetSlice(new_bases, j, j, new_base) < 0) {

85+

Py_DECREF(new_base);

8486

goto error;

8587

}

8688

Py_DECREF(new_base);

@@ -102,8 +104,9 @@ static PyObject *

102104

builtin___build_class__(PyObject *self, PyObject *const *args, Py_ssize_t nargs,

103105

PyObject *kwnames)

104106

{

105-

PyObject *func, *name, *bases, *mkw, *meta, *winner, *prep, *ns, *orig_bases;

106-

PyObject *cls = NULL, *cell = NULL;

107+

PyObject *func, *name, *winner, *prep;

108+

PyObject *cls = NULL, *cell = NULL, *ns = NULL, *meta = NULL, *orig_bases = NULL;

109+

PyObject *mkw = NULL, *bases = NULL;

107110

int isclass = 0; /* initialize to prevent gcc warning */

108111109112

if (nargs < 2) {

@@ -140,26 +143,20 @@ builtin___build_class__(PyObject *self, PyObject *const *args, Py_ssize_t nargs,

140143

else {

141144

mkw = _PyStack_AsDict(args + nargs, kwnames);

142145

if (mkw == NULL) {

143-

Py_DECREF(bases);

144-

return NULL;

146+

goto error;

145147

}

146148147149

meta = _PyDict_GetItemIdWithError(mkw, &PyId_metaclass);

148150

if (meta != NULL) {

149151

Py_INCREF(meta);

150152

if (_PyDict_DelItemId(mkw, &PyId_metaclass) < 0) {

151-

Py_DECREF(meta);

152-

Py_DECREF(mkw);

153-

Py_DECREF(bases);

154-

return NULL;

153+

goto error;

155154

}

156155

/* metaclass is explicitly given, check if it's indeed a class */

157156

isclass = PyType_Check(meta);

158157

}

159158

else if (PyErr_Occurred()) {

160-

Py_DECREF(mkw);

161-

Py_DECREF(bases);

162-

return NULL;

159+

goto error;

163160

}

164161

}

165162

if (meta == NULL) {

@@ -182,10 +179,7 @@ builtin___build_class__(PyObject *self, PyObject *const *args, Py_ssize_t nargs,

182179

winner = (PyObject *)_PyType_CalculateMetaclass((PyTypeObject *)meta,

183180

bases);

184181

if (winner == NULL) {

185-

Py_DECREF(meta);

186-

Py_XDECREF(mkw);

187-

Py_DECREF(bases);

188-

return NULL;

182+

goto error;

189183

}

190184

if (winner != meta) {

191185

Py_DECREF(meta);

@@ -207,10 +201,7 @@ builtin___build_class__(PyObject *self, PyObject *const *args, Py_ssize_t nargs,

207201

Py_DECREF(prep);

208202

}

209203

if (ns == NULL) {

210-

Py_DECREF(meta);

211-

Py_XDECREF(mkw);

212-

Py_DECREF(bases);

213-

return NULL;

204+

goto error;

214205

}

215206

if (!PyMapping_Check(ns)) {

216207

PyErr_Format(PyExc_TypeError,

@@ -251,13 +242,13 @@ builtin___build_class__(PyObject *self, PyObject *const *args, Py_ssize_t nargs,

251242

}

252243

error:

253244

Py_XDECREF(cell);

254-

Py_DECREF(ns);

255-

Py_DECREF(meta);

245+

Py_XDECREF(ns);

246+

Py_XDECREF(meta);

256247

Py_XDECREF(mkw);

257-

Py_DECREF(bases);

258248

if (bases != orig_bases) {

259249

Py_DECREF(orig_bases);

260250

}

251+

Py_DECREF(bases);

261252

return cls;

262253

}

263254