diff --git a/Misc/NEWS.d/next/Library/2019-08-22-16-08-46.bpo-34410.4DcUaI.rst b/Misc/NEWS.d/next/Library/2019-08-22-16-08-46.bpo-34410.4DcUaI.rst new file mode 100644 index 00000000000000..8c1d6ad36819f7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-08-22-16-08-46.bpo-34410.4DcUaI.rst @@ -0,0 +1 @@ +Fix itertools.tee() crash in multithreading. Patch by hongweipeng. diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c index ec8f0ae14206cb..8024b8c62f090c 100644 --- a/Modules/itertoolsmodule.c +++ b/Modules/itertoolsmodule.c @@ -492,10 +492,18 @@ teedataobject_getitem(teedataobject *tdo, int i) /* this is the lead iterator, so fetch more data */ assert(i == tdo->numread); value = PyIter_Next(tdo->it); - if (value == NULL) + + if (value != NULL) { + teedataobject *temp = tdo; + while (temp->numread >= LINKCELLS) { + temp = (teedataobject *) teedataobject_jumplink(temp); + } + temp->values[temp->numread] = value; + temp->numread++; + }else if (i == tdo->numread || PyErr_Occurred()) { return NULL; - tdo->numread++; - tdo->values[i] = value; + } + value = tdo->values[i]; } Py_INCREF(value); return value;