diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2021-07-05 22:34:53 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-05 22:34:53 (GMT) |
commit | 645e527298b1f24625783338076330037d860162 (patch) | |
tree | 069eaecd4935795e89403efe9b5db83f947bf214 | |
parent | 846cc4d28025ac4319069ec3c6db9526c75efd40 (diff) | |
download | cpython-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.c | 19 |
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; } |