diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2018-10-20 06:05:19 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-20 06:05:19 (GMT) |
commit | 0d3dd9fe0d2565f09f70d8ea7341dfd88e6bd380 (patch) | |
tree | 341d0c95c819d91a22200a80dd31b6e182f55d50 /Objects/odictobject.c | |
parent | 42c52a9e45ed6ff2867403894bc030ed5780282d (diff) | |
download | cpython-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.c | 37 |
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[] = { |