mirror of
https://github.com/python/cpython.git
synced 2025-08-03 08:34:29 +00:00
Issue #26494: Fixed crash on iterating exhausting iterators.
Affected classes are generic sequence iterators, iterators of str, bytes, bytearray, list, tuple, set, frozenset, dict, OrderedDict, corresponding views and os.scandir() iterator.
This commit is contained in:
commit
ab479c49d3
19 changed files with 94 additions and 24 deletions
|
@ -3126,8 +3126,8 @@ bytearrayiter_next(bytesiterobject *it)
|
|||
return item;
|
||||
}
|
||||
|
||||
Py_DECREF(seq);
|
||||
it->it_seq = NULL;
|
||||
Py_DECREF(seq);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -3806,8 +3806,8 @@ striter_next(striterobject *it)
|
|||
return item;
|
||||
}
|
||||
|
||||
Py_DECREF(seq);
|
||||
it->it_seq = NULL;
|
||||
Py_DECREF(seq);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -2988,8 +2988,8 @@ static PyObject *dictiter_iternextkey(dictiterobject *di)
|
|||
return key;
|
||||
|
||||
fail:
|
||||
Py_DECREF(d);
|
||||
di->di_dict = NULL;
|
||||
Py_DECREF(d);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -3069,8 +3069,8 @@ static PyObject *dictiter_iternextvalue(dictiterobject *di)
|
|||
return value;
|
||||
|
||||
fail:
|
||||
Py_DECREF(d);
|
||||
di->di_dict = NULL;
|
||||
Py_DECREF(d);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -3164,8 +3164,8 @@ static PyObject *dictiter_iternextitem(dictiterobject *di)
|
|||
return result;
|
||||
|
||||
fail:
|
||||
Py_DECREF(d);
|
||||
di->di_dict = NULL;
|
||||
Py_DECREF(d);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -69,8 +69,8 @@ iter_iternext(PyObject *iterator)
|
|||
PyErr_ExceptionMatches(PyExc_StopIteration))
|
||||
{
|
||||
PyErr_Clear();
|
||||
Py_DECREF(seq);
|
||||
it->it_seq = NULL;
|
||||
Py_DECREF(seq);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -2776,8 +2776,8 @@ listiter_next(listiterobject *it)
|
|||
return item;
|
||||
}
|
||||
|
||||
Py_DECREF(seq);
|
||||
it->it_seq = NULL;
|
||||
Py_DECREF(seq);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -2906,9 +2906,17 @@ static PyObject *
|
|||
listreviter_next(listreviterobject *it)
|
||||
{
|
||||
PyObject *item;
|
||||
Py_ssize_t index = it->it_index;
|
||||
PyListObject *seq = it->it_seq;
|
||||
Py_ssize_t index;
|
||||
PyListObject *seq;
|
||||
|
||||
assert(it != NULL);
|
||||
seq = it->it_seq;
|
||||
if (seq == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
assert(PyList_Check(seq));
|
||||
|
||||
index = it->it_index;
|
||||
if (index>=0 && index < PyList_GET_SIZE(seq)) {
|
||||
item = PyList_GET_ITEM(seq, index);
|
||||
it->it_index--;
|
||||
|
@ -2916,10 +2924,8 @@ listreviter_next(listreviterobject *it)
|
|||
return item;
|
||||
}
|
||||
it->it_index = -1;
|
||||
if (seq != NULL) {
|
||||
it->it_seq = NULL;
|
||||
Py_DECREF(seq);
|
||||
}
|
||||
it->it_seq = NULL;
|
||||
Py_DECREF(seq);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -916,8 +916,8 @@ static PyObject *setiter_iternext(setiterobject *si)
|
|||
return key;
|
||||
|
||||
fail:
|
||||
Py_DECREF(so);
|
||||
si->si_set = NULL;
|
||||
Py_DECREF(so);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -961,8 +961,8 @@ tupleiter_next(tupleiterobject *it)
|
|||
return item;
|
||||
}
|
||||
|
||||
Py_DECREF(seq);
|
||||
it->it_seq = NULL;
|
||||
Py_DECREF(seq);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -15401,8 +15401,8 @@ unicodeiter_next(unicodeiterobject *it)
|
|||
return item;
|
||||
}
|
||||
|
||||
Py_DECREF(seq);
|
||||
it->it_seq = NULL;
|
||||
Py_DECREF(seq);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue