summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorGregory P. Smith <greg@mad-scientist.com>2008-07-22 04:46:32 (GMT)
committerGregory P. Smith <greg@mad-scientist.com>2008-07-22 04:46:32 (GMT)
commit0470bab69783c13447cb634fa403ef1067fe56d1 (patch)
tree8930faf64b2224f282512ff18a41bb0b338beded /Objects
parentf5574a0c290aac0ec581415fdd343641c00d5d42 (diff)
downloadcpython-0470bab69783c13447cb634fa403ef1067fe56d1.zip
cpython-0470bab69783c13447cb634fa403ef1067fe56d1.tar.gz
cpython-0470bab69783c13447cb634fa403ef1067fe56d1.tar.bz2
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 'Objects')
-rw-r--r--Objects/obmalloc.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c
index efbd566..da8f9c2 100644
--- a/Objects/obmalloc.c
+++ b/Objects/obmalloc.c
@@ -727,6 +727,15 @@ PyObject_Malloc(size_t nbytes)
uint size;
/*
+ * Limit ourselves to PY_SSIZE_T_MAX bytes to prevent security holes.
+ * Most python internals blindly use a signed Py_ssize_t to track
+ * things without checking for overflows or negatives.
+ * As size_t is unsigned, checking for nbytes < 0 is not required.
+ */
+ if (nbytes > PY_SSIZE_T_MAX)
+ return NULL;
+
+ /*
* This implicitly redirects malloc(0).
*/
if ((nbytes - 1) < SMALL_REQUEST_THRESHOLD) {
@@ -1130,6 +1139,15 @@ PyObject_Realloc(void *p, size_t nbytes)
if (p == NULL)
return PyObject_Malloc(nbytes);
+ /*
+ * Limit ourselves to PY_SSIZE_T_MAX bytes to prevent security holes.
+ * Most python internals blindly use a signed Py_ssize_t to track
+ * things without checking for overflows or negatives.
+ * As size_t is unsigned, checking for nbytes < 0 is not required.
+ */
+ if (nbytes > PY_SSIZE_T_MAX)
+ return NULL;
+
pool = POOL_ADDR(p);
if (Py_ADDRESS_IN_RANGE(p, pool)) {
/* We're in charge of this block */