diff Modules/arraymodule.c @ 48046:5d3833e6aae3 legacy-trunk

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.
author Gregory P. Smith <greg@mad-scientist.com>
date Tue, 22 Jul 2008 04:46:32 +0000
parents a35da94e05fc
children 74c0a78114ae
line wrap: on
line diff
--- a/Modules/arraymodule.c	Mon Jul 21 22:05:34 2008 +0000
+++ b/Modules/arraymodule.c	Tue Jul 22 04:46:32 2008 +0000
@@ -815,6 +815,7 @@
 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 @@
 		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 @@
 			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;