summaryrefslogtreecommitdiff
path: root/Objects/listobject.c
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2016-03-30 20:41:15 +0300
committerSerhiy Storchaka <storchaka@gmail.com>2016-03-30 20:41:15 +0300
commitab479c49d31be03e85b824b8444b474b28e6db71 (patch)
treef171c7cb1f6e5568b7309665b0e87dae9dda67f5 /Objects/listobject.c
parentfe4c01268cf9e94869a476495213fc362ef3a697 (diff)
parentfbb1c5ee068d209e33f6e15ecb4821d5d8b107fa (diff)
downloadcpython-git-ab479c49d31be03e85b824b8444b474b28e6db71.tar.gz
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.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/Objects/listobject.c b/Objects/listobject.c
index bcf587c5cb..81b40ae355 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;
}