summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2021-07-05 22:34:53 (GMT)
committerGitHub <noreply@github.com>2021-07-05 22:34:53 (GMT)
commit645e527298b1f24625783338076330037d860162 (patch)
tree069eaecd4935795e89403efe9b5db83f947bf214
parent846cc4d28025ac4319069ec3c6db9526c75efd40 (diff)
downloadcpython-645e527298b1f24625783338076330037d860162.zip
cpython-645e527298b1f24625783338076330037d860162.tar.gz
cpython-645e527298b1f24625783338076330037d860162.tar.bz2
bpo-44563: Fix error handling in tee.fromiterable() (GH-27020) (GH-27041)
In debug build failed tee.fromiterable() corrupted the linked list of all GC objects. (cherry picked from commit f64de53ff01e734d48d1d42195443d7d1646f220) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com> Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
-rw-r--r--Modules/itertoolsmodule.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c
index 293735a..643f47b 100644
--- a/Modules/itertoolsmodule.c
+++ b/Modules/itertoolsmodule.c
@@ -863,7 +863,7 @@ static PyObject *
tee_fromiterable(PyObject *iterable)
{
teeobject *to;
- PyObject *it = NULL;
+ PyObject *it;
it = PyObject_GetIter(iterable);
if (it == NULL)
@@ -873,21 +873,22 @@ tee_fromiterable(PyObject *iterable)
goto done;
}
- to = PyObject_GC_New(teeobject, &tee_type);
- if (to == NULL)
- goto done;
- to->dataobj = (teedataobject *)teedataobject_newinternal(it);
- if (!to->dataobj) {
- PyObject_GC_Del(to);
+ PyObject *dataobj = teedataobject_newinternal(it);
+ if (!dataobj) {
to = NULL;
goto done;
}
-
+ to = PyObject_GC_New(teeobject, &tee_type);
+ if (to == NULL) {
+ Py_DECREF(dataobj);
+ goto done;
+ }
+ to->dataobj = (teedataobject *)dataobj;
to->index = 0;
to->weakreflist = NULL;
PyObject_GC_Track(to);
done:
- Py_XDECREF(it);
+ Py_DECREF(it);
return (PyObject *)to;
}