diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2016-03-30 17:41:15 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2016-03-30 17:41:15 (GMT) |
commit | ab479c49d31be03e85b824b8444b474b28e6db71 (patch) | |
tree | f171c7cb1f6e5568b7309665b0e87dae9dda67f5 /Objects/listobject.c | |
parent | fe4c01268cf9e94869a476495213fc362ef3a697 (diff) | |
parent | fbb1c5ee068d209e33f6e15ecb4821d5d8b107fa (diff) | |
download | cpython-ab479c49d31be03e85b824b8444b474b28e6db71.zip cpython-ab479c49d31be03e85b824b8444b474b28e6db71.tar.gz cpython-ab479c49d31be03e85b824b8444b474b28e6db71.tar.bz2 |
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.
Diffstat (limited to 'Objects/listobject.c')
-rw-r--r-- | Objects/listobject.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/Objects/listobject.c b/Objects/listobject.c index bcf587c..81b40ae 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -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; } |