Mercurial > cpython-lru_cache-weakref
diff Modules/arraymodule.c @ 45614:0565130d7d9f 2.4
Backport of r60793:
Added checks for integer overflows, contributed by Google. Some are
only available if asserts are left in the code, in cases where they
can't be triggered from Python code.
| author | Martin v. Löwis <martin@v.loewis.de> |
|---|---|
| date | Sun, 02 Mar 2008 19:20:32 +0000 |
| parents | 5d93e5ccb31e |
| children | cc84ee6667b7 |
line wrap: on
line diff
--- a/Modules/arraymodule.c Sun Mar 02 17:47:51 2008 +0000 +++ b/Modules/arraymodule.c Sun Mar 02 19:20:32 2008 +0000 @@ -651,6 +651,9 @@ PyErr_BadArgument(); return NULL; } + if (a->ob_size > INT_MAX - b->ob_size) { + return PyErr_NoMemory(); + } size = a->ob_size + b->ob_size; np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr); if (np == NULL) { @@ -673,6 +676,9 @@ int nbytes; if (n < 0) n = 0; + if ((a->ob_size != 0) && (n > INT_MAX / a->ob_size)) { + return PyErr_NoMemory(); + } size = a->ob_size * n; np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr); if (np == NULL) @@ -817,6 +823,11 @@ "can only extend with array of same kind"); return -1; } + if ((self->ob_size > INT_MAX - b->ob_size) || + ((self->ob_size + b->ob_size) > INT_MAX / self->ob_descr->itemsize)) { + PyErr_NoMemory(); + return -1; + } size = self->ob_size + b->ob_size; PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize); if (self->ob_item == NULL) { @@ -858,6 +869,10 @@ if (n < 0) n = 0; items = self->ob_item; + if ((self->ob_descr->itemsize != 0) && + (self->ob_size > INT_MAX / self->ob_descr->itemsize)) { + return PyErr_NoMemory(); + } size = self->ob_size * self->ob_descr->itemsize; if (n == 0) { PyMem_FREE(items); @@ -866,6 +881,9 @@ self->allocated = 0; } else { + if (size > INT_MAX / n) { + return PyErr_NoMemory(); + } PyMem_Resize(items, char, n * size); if (items == NULL) return PyErr_NoMemory(); @@ -1278,6 +1296,9 @@ if ((*self->ob_descr->setitem)(self, self->ob_size - n + i, v) != 0) { self->ob_size -= n; + if (itemsize && (self->ob_size > INT_MAX / itemsize)) { + return PyErr_NoMemory(); + } PyMem_RESIZE(item, char, self->ob_size * itemsize); self->ob_item = item; @@ -1337,6 +1358,10 @@ n = n / itemsize; if (n > 0) { char *item = self->ob_item; + if ((n > INT_MAX - self->ob_size) || + ((self->ob_size + n) > INT_MAX / itemsize)) { + return PyErr_NoMemory(); + } PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize); if (item == NULL) { PyErr_NoMemory(); @@ -1362,8 +1387,12 @@ static PyObject * array_tostring(arrayobject *self, PyObject *unused) { - return PyString_FromStringAndSize(self->ob_item, + if (self->ob_size <= INT_MAX / self->ob_descr->itemsize) { + return PyString_FromStringAndSize(self->ob_item, self->ob_size * self->ob_descr->itemsize); + } else { + return PyErr_NoMemory(); + } } PyDoc_STRVAR(tostring_doc, @@ -1391,6 +1420,9 @@ } if (n > 0) { Py_UNICODE *item = (Py_UNICODE *) self->ob_item; + if (self->ob_size > INT_MAX - n) { + return PyErr_NoMemory(); + } PyMem_RESIZE(item, Py_UNICODE, self->ob_size + n); if (item == NULL) { PyErr_NoMemory();
