Commit 2c40f640 authored by Victor Stinner's avatar Victor Stinner

Issue #18408: Fix list_ass_slice(), handle list_resize() failure

I tested the patch manually by injecting a fault using gdb: list items are
correctly restored on failure.
parent 9007dd72
...@@ -644,9 +644,14 @@ list_ass_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v) ...@@ -644,9 +644,14 @@ list_ass_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
memcpy(recycle, &item[ilow], s); memcpy(recycle, &item[ilow], s);
if (d < 0) { /* Delete -d items */ if (d < 0) { /* Delete -d items */
memmove(&item[ihigh+d], &item[ihigh], Py_ssize_t tail;
(Py_SIZE(a) - ihigh)*sizeof(PyObject *)); tail = (Py_SIZE(a) - ihigh) * sizeof(PyObject *);
list_resize(a, Py_SIZE(a) + d); memmove(&item[ihigh+d], &item[ihigh], tail);
if (list_resize(a, Py_SIZE(a) + d) < 0) {
memmove(&item[ihigh], &item[ihigh+d], tail);
memcpy(&item[ilow], recycle, s);
goto Error;
}
item = a->ob_item; item = a->ob_item;
} }
else if (d > 0) { /* Insert d items */ else if (d > 0) { /* Insert d items */
......
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