summaryrefslogtreecommitdiffstats
path: root/Objects/odictobject.c
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2018-10-20 06:05:19 (GMT)
committerGitHub <noreply@github.com>2018-10-20 06:05:19 (GMT)
commit0d3dd9fe0d2565f09f70d8ea7341dfd88e6bd380 (patch)
tree341d0c95c819d91a22200a80dd31b6e182f55d50 /Objects/odictobject.c
parent42c52a9e45ed6ff2867403894bc030ed5780282d (diff)
downloadcpython-0d3dd9fe0d2565f09f70d8ea7341dfd88e6bd380.zip
cpython-0d3dd9fe0d2565f09f70d8ea7341dfd88e6bd380.tar.gz
cpython-0d3dd9fe0d2565f09f70d8ea7341dfd88e6bd380.tar.bz2
bpo-34574: Prevent OrderedDict iterators from exhaustion during pickling. (GH-9051)
(cherry picked from commit a5259fb05d03f4871837c14fed704541a20896c0) Co-authored-by: Sergey Fedoseev <fedoseev.sergey@gmail.com>
Diffstat (limited to 'Objects/odictobject.c')
-rw-r--r--Objects/odictobject.c37
1 files changed, 9 insertions, 28 deletions
diff --git a/Objects/odictobject.c b/Objects/odictobject.c
index 26f1579..73f3158 100644
--- a/Objects/odictobject.c
+++ b/Objects/odictobject.c
@@ -1923,38 +1923,19 @@ PyDoc_STRVAR(reduce_doc, "Return state information for pickling");
static PyObject *
odictiter_reduce(odictiterobject *di)
{
- PyObject *list, *iter;
-
- list = PyList_New(0);
- if (!list)
- return NULL;
+ /* copy the iterator state */
+ odictiterobject tmp = *di;
+ Py_XINCREF(tmp.di_odict);
+ Py_XINCREF(tmp.di_current);
/* iterate the temporary into a list */
- for(;;) {
- PyObject *element = odictiter_iternext(di);
- if (element) {
- if (PyList_Append(list, element)) {
- Py_DECREF(element);
- Py_DECREF(list);
- return NULL;
- }
- Py_DECREF(element);
- }
- else {
- /* done iterating? */
- break;
- }
- }
- if (PyErr_Occurred()) {
- Py_DECREF(list);
- return NULL;
- }
- iter = _PyObject_GetBuiltin("iter");
- if (iter == NULL) {
- Py_DECREF(list);
+ PyObject *list = PySequence_List((PyObject*)&tmp);
+ Py_XDECREF(tmp.di_odict);
+ Py_XDECREF(tmp.di_current);
+ if (list == NULL) {
return NULL;
}
- return Py_BuildValue("N(N)", iter, list);
+ return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), list);
}
static PyMethodDef odictiter_methods[] = {