Commit a0ae9ff0 authored by Serhiy Storchaka's avatar Serhiy Storchaka

Issue #19687: Fixed memory leak on failed Element slice assignment.

parent 4d04361b
...@@ -1390,15 +1390,17 @@ element_ass_subscr(PyObject* self_, PyObject* item, PyObject* value) ...@@ -1390,15 +1390,17 @@ element_ass_subscr(PyObject* self_, PyObject* item, PyObject* value)
if (step != 1 && newlen != slicelen) if (step != 1 && newlen != slicelen)
{ {
Py_XDECREF(seq);
PyErr_Format(PyExc_ValueError, PyErr_Format(PyExc_ValueError,
#if (PY_VERSION_HEX < 0x02050000) #if (PY_VERSION_HEX < 0x02050000)
"attempt to assign sequence of size %d " "attempt to assign sequence of size %d "
"to extended slice of size %d", "to extended slice of size %d",
(int)newlen, (int)slicelen
#else #else
"attempt to assign sequence of size %zd " "attempt to assign sequence of size %zd "
"to extended slice of size %zd", "to extended slice of size %zd",
#endif
newlen, slicelen newlen, slicelen
#endif
); );
return -1; return -1;
} }
...@@ -1407,9 +1409,7 @@ element_ass_subscr(PyObject* self_, PyObject* item, PyObject* value) ...@@ -1407,9 +1409,7 @@ element_ass_subscr(PyObject* self_, PyObject* item, PyObject* value)
/* Resize before creating the recycle bin, to prevent refleaks. */ /* Resize before creating the recycle bin, to prevent refleaks. */
if (newlen > slicelen) { if (newlen > slicelen) {
if (element_resize(self, newlen - slicelen) < 0) { if (element_resize(self, newlen - slicelen) < 0) {
if (seq) { Py_XDECREF(seq);
Py_DECREF(seq);
}
return -1; return -1;
} }
} }
...@@ -1420,9 +1420,7 @@ element_ass_subscr(PyObject* self_, PyObject* item, PyObject* value) ...@@ -1420,9 +1420,7 @@ element_ass_subscr(PyObject* self_, PyObject* item, PyObject* value)
we're done modifying the element */ we're done modifying the element */
recycle = PyList_New(slicelen); recycle = PyList_New(slicelen);
if (!recycle) { if (!recycle) {
if (seq) { Py_XDECREF(seq);
Py_DECREF(seq);
}
return -1; return -1;
} }
for (cur = start, i = 0; i < slicelen; for (cur = start, i = 0; i < slicelen;
...@@ -1450,9 +1448,7 @@ element_ass_subscr(PyObject* self_, PyObject* item, PyObject* value) ...@@ -1450,9 +1448,7 @@ element_ass_subscr(PyObject* self_, PyObject* item, PyObject* value)
self->extra->length += newlen - slicelen; self->extra->length += newlen - slicelen;
if (seq) { Py_XDECREF(seq);
Py_DECREF(seq);
}
/* discard the recycle bin, and everything in it */ /* discard the recycle bin, and everything in it */
Py_XDECREF(recycle); Py_XDECREF(recycle);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment