]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Prevent creation (followed by a segfault) of array types when the size
authorThomas Heller <theller@ctypes.org>
Fri, 23 Mar 2007 19:56:45 +0000 (19:56 +0000)
committerThomas Heller <theller@ctypes.org>
Fri, 23 Mar 2007 19:56:45 +0000 (19:56 +0000)
overflows the valid Py_ssize_t range.  Check return values of
PyMem_Malloc.

Backported from trunk.

Modules/_ctypes/_ctypes.c

index 941da0b56d4f75c1cc817a219120d61c2379f09d..4dd35c233f8d57d3ec4047f76b08545b58a9bd7e 100644 (file)
@@ -1002,6 +1002,12 @@ ArrayType_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
        }
 
        itemsize = itemdict->size;
+       if (length * itemsize < 0) {
+               PyErr_SetString(PyExc_OverflowError,
+                               "array too large");
+               return NULL;
+       }
+
        itemalign = itemdict->align;
 
        stgdict->size = itemsize * length;
@@ -2176,7 +2182,7 @@ PyTypeObject CData_Type = {
        0,                                      /* tp_free */
 };
 
-static void CData_MallocBuffer(CDataObject *obj, StgDictObject *dict)
+static int CData_MallocBuffer(CDataObject *obj, StgDictObject *dict)
 {
        if ((size_t)dict->size <= sizeof(obj->b_value)) {
                /* No need to call malloc, can use the default buffer */
@@ -2193,10 +2199,15 @@ static void CData_MallocBuffer(CDataObject *obj, StgDictObject *dict)
                   33% of the creation time for c_int().
                */
                obj->b_ptr = (char *)PyMem_Malloc(dict->size);
+               if (obj->b_ptr == NULL) {
+                       PyErr_NoMemory();
+                       return -1;
+               }
                obj->b_needsfree = 1;
                memset(obj->b_ptr, 0, dict->size);
        }
        obj->b_size = dict->size;
+       return 0;
 }
 
 PyObject *
@@ -2228,7 +2239,10 @@ CData_FromBaseObj(PyObject *type, PyObject *base, Py_ssize_t index, char *adr)
                cmem->b_base = (CDataObject *)base;
                cmem->b_index = index;
        } else { /* copy contents of adr */
-               CData_MallocBuffer(cmem, dict);
+               if (-1 == CData_MallocBuffer(cmem, dict)) {
+                       return NULL;
+                       Py_DECREF(cmem);
+               }
                memcpy(cmem->b_ptr, adr, dict->size);
                cmem->b_index = index;
        }
@@ -2441,7 +2455,10 @@ GenericCData_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
        obj->b_objects = NULL;
        obj->b_length = dict->length;
                        
-       CData_MallocBuffer(obj, dict);
+       if (-1 == CData_MallocBuffer(obj, dict)) {
+               Py_DECREF(obj);
+               return NULL;
+       }
        return (PyObject *)obj;
 }
 /*****************************************************************/