diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2013-07-19 23:06:21 +0200 |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2013-07-19 23:06:21 +0200 |
commit | 2c0f400d362494e894d4574c86fb11848da28793 (patch) | |
tree | 58e16bb7b4db5dd5b719bd8ae96aec8dd69f74e4 /Objects/listobject.c | |
parent | 014490ae0c008d984ed76f7c8321598b5b0a15f2 (diff) | |
download | cpython-2c0f400d362494e894d4574c86fb11848da28793.tar.gz |
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.
Diffstat (limited to 'Objects/listobject.c')
-rw-r--r-- | Objects/listobject.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/Objects/listobject.c b/Objects/listobject.c index ce6b70889e..2f203b343f 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -644,9 +644,14 @@ list_ass_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v) memcpy(recycle, &item[ilow], s); if (d < 0) { /* Delete -d items */ - memmove(&item[ihigh+d], &item[ihigh], - (Py_SIZE(a) - ihigh)*sizeof(PyObject *)); - list_resize(a, Py_SIZE(a) + d); + Py_ssize_t tail; + tail = (Py_SIZE(a) - ihigh) * sizeof(PyObject *); + 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; } else if (d > 0) { /* Insert d items */ |