mirror of
https://github.com/python/cpython.git
synced 2025-07-31 07:04:42 +00:00
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.
This commit is contained in:
parent
f5574a0c29
commit
0470bab697
7 changed files with 59 additions and 14 deletions
|
@ -815,6 +815,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);
|
||||
|
@ -830,8 +831,10 @@ array_do_extend(arrayobject *self, PyObject *bb)
|
|||
return -1;
|
||||
}
|
||||
size = Py_SIZE(self) + Py_SIZE(b);
|
||||
old_item = self->ob_item;
|
||||
PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
|
||||
if (self->ob_item == NULL) {
|
||||
self->ob_item = old_item;
|
||||
PyErr_NoMemory();
|
||||
return -1;
|
||||
}
|
||||
|
@ -884,7 +887,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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue