diff options
author | Neal Norwitz <nnorwitz@gmail.com> | 2008-07-28 05:06:20 +0000 |
---|---|---|
committer | Neal Norwitz <nnorwitz@gmail.com> | 2008-07-28 05:06:20 +0000 |
commit | 83ac0144fa3041556aa4f3952ebd979e0189a19c (patch) | |
tree | 6ea0926c622f76b3eb8542cad72ffde6aaabc551 /Modules/arraymodule.c | |
parent | c8e4bed1c5a11b0447feb38d0870af056a71ad2c (diff) | |
download | cpython-git-83ac0144fa3041556aa4f3952ebd979e0189a19c.tar.gz |
Backport code from r65182:
Issue #2620: Overflow checking when allocating or reallocating memory
was not always being done properly in some python types and extension
modules. PyMem_MALLOC, PyMem_REALLOC, PyMem_NEW and PyMem_RESIZE have
all been updated to perform better checks and places in the code that
would previously leak memory on the error path when such an allocation
failed have been fixed.
Diffstat (limited to 'Modules/arraymodule.c')
-rw-r--r-- | Modules/arraymodule.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c index eafea988c9..f262d206a8 100644 --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -816,6 +816,7 @@ static int array_do_extend(arrayobject *self, PyObject *bb) { Py_ssize_t size; + char *old_item; if (!array_Check(bb)) return array_iter_extend(self, bb); @@ -831,10 +832,11 @@ array_do_extend(arrayobject *self, PyObject *bb) return -1; } size = self->ob_size + b->ob_size; + old_item = self->ob_item; PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize); if (self->ob_item == NULL) { - PyObject_Del(self); - PyErr_NoMemory(); + self->ob_item = old_item; + PyErr_NoMemory(); return -1; } memcpy(self->ob_item + self->ob_size*self->ob_descr->itemsize, @@ -886,7 +888,7 @@ array_inplace_repeat(arrayobject *self, Py_ssize_t n) if (size > PY_SSIZE_T_MAX / n) { return PyErr_NoMemory(); } - PyMem_Resize(items, char, n * size); + PyMem_RESIZE(items, char, n * size); if (items == NULL) return PyErr_NoMemory(); p = items; |