]> granicus.if.org Git - python/commitdiff
Issue #18203: Replace malloc() with PyMem_Malloc() in Python modules
authorVictor Stinner <victor.stinner@gmail.com>
Sun, 7 Jul 2013 14:21:41 +0000 (16:21 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Sun, 7 Jul 2013 14:21:41 +0000 (16:21 +0200)
Replace malloc() with PyMem_Malloc() when the GIL is held, or with
PyMem_RawMalloc() otherwise.

Modules/_curses_panel.c
Modules/_cursesmodule.c
Modules/_lsprof.c
Modules/_ssl.c
Modules/audioop.c
Modules/posixmodule.c
Modules/pyexpat.c
Modules/readline.c
Modules/zlibmodule.c
PC/winreg.c

index f5607028784755fc57dc667a3c0b6f985ef2e78c..3e9fffd9587e6592226a68d9fabb886bcf813d5d 100644 (file)
@@ -117,7 +117,7 @@ insert_lop(PyCursesPanelObject *po)
 {
     list_of_panels *new;
 
-    if ((new = (list_of_panels *)malloc(sizeof(list_of_panels))) == NULL) {
+    if ((new = (list_of_panels *)PyMem_Malloc(sizeof(list_of_panels))) == NULL) {
         PyErr_NoMemory();
         return -1;
     }
@@ -136,7 +136,7 @@ remove_lop(PyCursesPanelObject *po)
     temp = lop;
     if (temp->po == po) {
         lop = temp->next;
-        free(temp);
+        PyMem_Free(temp);
         return;
     }
     while (temp->next == NULL || temp->next->po != po) {
@@ -148,7 +148,7 @@ remove_lop(PyCursesPanelObject *po)
         temp = temp->next;
     }
     n = temp->next->next;
-    free(temp->next);
+    PyMem_Free(temp->next);
     temp->next = n;
     return;
 }
index dff1a17b117ae312c08da30a1c93a87f36b36d92..fbe18f6e06b9b8edb7ef0fead895ba008b50d65b 100644 (file)
@@ -3406,7 +3406,7 @@ PyInit__curses(void)
                 continue;
             if (strncmp(key_n,"KEY_F(",6)==0) {
                 char *p1, *p2;
-                key_n2 = malloc(strlen(key_n)+1);
+                key_n2 = PyMem_Malloc(strlen(key_n)+1);
                 if (!key_n2) {
                     PyErr_NoMemory();
                     break;
@@ -3425,7 +3425,7 @@ PyInit__curses(void)
                 key_n2 = key_n;
             SetDictInt(key_n2,key);
             if (key_n2 != key_n)
-                free(key_n2);
+                PyMem_Free(key_n2);
         }
 #endif
         SetDictInt("KEY_MIN", KEY_MIN);
index 5657f2f67652dabd0b24b8f9546a0920e1f465e0..fef255fdf5441ea6fbcf533a2448c1eae133bb21 100644 (file)
@@ -223,7 +223,7 @@ static ProfilerEntry*
 newProfilerEntry(ProfilerObject *pObj, void *key, PyObject *userObj)
 {
     ProfilerEntry *self;
-    self = (ProfilerEntry*) malloc(sizeof(ProfilerEntry));
+    self = (ProfilerEntry*) PyMem_Malloc(sizeof(ProfilerEntry));
     if (self == NULL) {
         pObj->flags |= POF_NOMEMORY;
         return NULL;
@@ -231,7 +231,7 @@ newProfilerEntry(ProfilerObject *pObj, void *key, PyObject *userObj)
     userObj = normalizeUserObj(userObj);
     if (userObj == NULL) {
         PyErr_Clear();
-        free(self);
+        PyMem_Free(self);
         pObj->flags |= POF_NOMEMORY;
         return NULL;
     }
@@ -264,7 +264,7 @@ static ProfilerSubEntry *
 newSubEntry(ProfilerObject *pObj,  ProfilerEntry *caller, ProfilerEntry* entry)
 {
     ProfilerSubEntry *self;
-    self = (ProfilerSubEntry*) malloc(sizeof(ProfilerSubEntry));
+    self = (ProfilerSubEntry*) PyMem_Malloc(sizeof(ProfilerSubEntry));
     if (self == NULL) {
         pObj->flags |= POF_NOMEMORY;
         return NULL;
@@ -282,7 +282,7 @@ newSubEntry(ProfilerObject *pObj,  ProfilerEntry *caller, ProfilerEntry* entry)
 static int freeSubEntry(rotating_node_t *header, void *arg)
 {
     ProfilerSubEntry *subentry = (ProfilerSubEntry*) header;
-    free(subentry);
+    PyMem_Free(subentry);
     return 0;
 }
 
@@ -291,7 +291,7 @@ static int freeEntry(rotating_node_t *header, void *arg)
     ProfilerEntry *entry = (ProfilerEntry*) header;
     RotatingTree_Enum(entry->calls, freeSubEntry, NULL);
     Py_DECREF(entry->userObj);
-    free(entry);
+    PyMem_Free(entry);
     return 0;
 }
 
@@ -301,13 +301,13 @@ static void clearEntries(ProfilerObject *pObj)
     pObj->profilerEntries = EMPTY_ROTATING_TREE;
     /* release the memory hold by the ProfilerContexts */
     if (pObj->currentProfilerContext) {
-        free(pObj->currentProfilerContext);
+        PyMem_Free(pObj->currentProfilerContext);
         pObj->currentProfilerContext = NULL;
     }
     while (pObj->freelistProfilerContext) {
         ProfilerContext *c = pObj->freelistProfilerContext;
         pObj->freelistProfilerContext = c->previous;
-        free(c);
+        PyMem_Free(c);
     }
     pObj->freelistProfilerContext = NULL;
 }
@@ -393,7 +393,7 @@ ptrace_enter_call(PyObject *self, void *key, PyObject *userObj)
     else {
         /* free list exhausted, allocate a new one */
         pContext = (ProfilerContext*)
-            malloc(sizeof(ProfilerContext));
+            PyMem_Malloc(sizeof(ProfilerContext));
         if (pContext == NULL) {
             pObj->flags |= POF_NOMEMORY;
             goto restorePyerr;
@@ -712,7 +712,7 @@ flush_unmatched(ProfilerObject *pObj)
         else
             pObj->currentProfilerContext = pContext->previous;
         if (pContext)
-            free(pContext);
+            PyMem_Free(pContext);
     }
 
 }
index 1d7ddcbf69a655b1369cdfb8b16125cc5cf619d4..ff3ef9eeeb198c2dbcda0e391f1aac986777222d 100644 (file)
@@ -3118,7 +3118,7 @@ static int _setup_ssl_threads(void) {
     if (_ssl_locks == NULL) {
         _ssl_locks_count = CRYPTO_num_locks();
         _ssl_locks = (PyThread_type_lock *)
-            malloc(sizeof(PyThread_type_lock) * _ssl_locks_count);
+            PyMem_Malloc(sizeof(PyThread_type_lock) * _ssl_locks_count);
         if (_ssl_locks == NULL)
             return 0;
         memset(_ssl_locks, 0,
@@ -3130,7 +3130,7 @@ static int _setup_ssl_threads(void) {
                 for (j = 0;  j < i;  j++) {
                     PyThread_free_lock(_ssl_locks[j]);
                 }
-                free(_ssl_locks);
+                PyMem_Free(_ssl_locks);
                 return 0;
             }
         }
index 4f2b25f33a06fe68b662578cde74a31d53662230..7175cec7c7613fc86b8bd5a116318be3087278a2 100644 (file)
@@ -1137,8 +1137,8 @@ audioop_ratecv(PyObject *self, PyObject *args)
                         "not enough memory for output buffer");
         return 0;
     }
-    prev_i = (int *) malloc(nchannels * sizeof(int));
-    cur_i = (int *) malloc(nchannels * sizeof(int));
+    prev_i = (int *) PyMem_Malloc(nchannels * sizeof(int));
+    cur_i = (int *) PyMem_Malloc(nchannels * sizeof(int));
     if (prev_i == NULL || cur_i == NULL) {
         (void) PyErr_NoMemory();
         goto exit;
@@ -1257,10 +1257,8 @@ audioop_ratecv(PyObject *self, PyObject *args)
         }
     }
   exit:
-    if (prev_i != NULL)
-        free(prev_i);
-    if (cur_i != NULL)
-        free(cur_i);
+    PyMem_Free(prev_i);
+    PyMem_Free(cur_i);
     return rv;
 }
 
index 226a4d510b120c18173d73e67821054285283726..a9a64fada704f7f4ec42c1f99fae2f2050289254 100644 (file)
@@ -1298,14 +1298,14 @@ win32_wchdir(LPCWSTR path)
     if (!result)
         return FALSE;
     if (result > MAX_PATH+1) {
-        new_path = malloc(result * sizeof(wchar_t));
+        new_path = PyMem_RawMalloc(result * sizeof(wchar_t));
         if (!new_path) {
             SetLastError(ERROR_OUTOFMEMORY);
             return FALSE;
         }
         result = GetCurrentDirectoryW(result, new_path);
         if (!result) {
-            free(new_path);
+            PyMem_RawFree(new_path);
             return FALSE;
         }
     }
@@ -1316,7 +1316,7 @@ win32_wchdir(LPCWSTR path)
     env[1] = new_path[0];
     result = SetEnvironmentVariableW(env, new_path);
     if (new_path != _new_path)
-        free(new_path);
+        PyMem_RawFree(new_path);
     return result;
 }
 #endif
@@ -1497,7 +1497,7 @@ get_target_path(HANDLE hdl, wchar_t **target_path)
     if(!buf_size)
         return FALSE;
 
-    buf = (wchar_t *)malloc((buf_size+1)*sizeof(wchar_t));
+    buf = (wchar_t *)PyMem_Malloc((buf_size+1)*sizeof(wchar_t));
     if (!buf) {
         SetLastError(ERROR_OUTOFMEMORY);
         return FALSE;
@@ -1507,12 +1507,12 @@ get_target_path(HANDLE hdl, wchar_t **target_path)
                        buf, buf_size, VOLUME_NAME_DOS);
 
     if(!result_length) {
-        free(buf);
+        PyMem_Free(buf);
         return FALSE;
     }
 
     if(!CloseHandle(hdl)) {
-        free(buf);
+        PyMem_Free(buf);
         return FALSE;
     }
 
@@ -1603,7 +1603,7 @@ win32_xstat_impl(const char *path, struct win32_stat *result,
                     return -1;
 
                 code = win32_xstat_impl_w(target_path, result, FALSE);
-                free(target_path);
+                PyMem_Free(target_path);
                 return code;
             }
         } else
@@ -1699,7 +1699,7 @@ win32_xstat_impl_w(const wchar_t *path, struct win32_stat *result,
                     return -1;
 
                 code = win32_xstat_impl_w(target_path, result, FALSE);
-                free(target_path);
+                PyMem_Free(target_path);
                 return code;
             }
         } else
@@ -3089,7 +3089,7 @@ posix_getcwd(int use_bytes)
            terminating \0. If the buffer is too small, len includes
            the space needed for the terminator. */
         if (len >= sizeof wbuf/ sizeof wbuf[0]) {
-            wbuf2 = malloc(len * sizeof(wchar_t));
+            wbuf2 = PyMem_RawMalloc(len * sizeof(wchar_t));
             if (wbuf2)
                 len = GetCurrentDirectoryW(len, wbuf2);
         }
@@ -3100,12 +3100,12 @@ posix_getcwd(int use_bytes)
         }
         if (!len) {
             if (wbuf2 != wbuf)
-                free(wbuf2);
+                PyMem_RawFree(wbuf2);
             return PyErr_SetFromWindowsErr(0);
         }
         resobj = PyUnicode_FromWideChar(wbuf2, len);
         if (wbuf2 != wbuf)
-            free(wbuf2);
+            PyMem_RawFree(wbuf2);
         return resobj;
     }
 
@@ -3289,7 +3289,7 @@ _listdir_windows_no_opendir(path_t *path, PyObject *list)
             len = wcslen(path->wide);
         }
         /* The +5 is so we can append "\\*.*\0" */
-        wnamebuf = malloc((len + 5) * sizeof(wchar_t));
+        wnamebuf = PyMem_Malloc((len + 5) * sizeof(wchar_t));
         if (!wnamebuf) {
             PyErr_NoMemory();
             goto exit;
@@ -3410,8 +3410,7 @@ exit:
             }
         }
     }
-    if (wnamebuf)
-        free(wnamebuf);
+    PyMem_Free(wnamebuf);
 
     return list;
 }  /* end of _listdir_windows_no_opendir */
@@ -3575,7 +3574,7 @@ posix__getfullpathname(PyObject *self, PyObject *args)
                                   Py_ARRAY_LENGTH(woutbuf),
                                   woutbuf, &wtemp);
         if (result > Py_ARRAY_LENGTH(woutbuf)) {
-            woutbufp = malloc(result * sizeof(wchar_t));
+            woutbufp = PyMem_Malloc(result * sizeof(wchar_t));
             if (!woutbufp)
                 return PyErr_NoMemory();
             result = GetFullPathNameW(wpath, result, woutbufp, &wtemp);
@@ -3585,7 +3584,7 @@ posix__getfullpathname(PyObject *self, PyObject *args)
         else
             v = win32_error_object("GetFullPathNameW", po);
         if (woutbufp != woutbuf)
-            free(woutbufp);
+            PyMem_Free(woutbufp);
         return v;
     }
     /* Drop the argument parsing error as narrow strings
@@ -3655,7 +3654,7 @@ posix__getfinalpathname(PyObject *self, PyObject *args)
     if(!buf_size)
         return win32_error_object("GetFinalPathNameByHandle", po);
 
-    target_path = (wchar_t *)malloc((buf_size+1)*sizeof(wchar_t));
+    target_path = (wchar_t *)PyMem_Malloc((buf_size+1)*sizeof(wchar_t));
     if(!target_path)
         return PyErr_NoMemory();
 
@@ -3669,7 +3668,7 @@ posix__getfinalpathname(PyObject *self, PyObject *args)
 
     target_path[result_length] = 0;
     result = PyUnicode_FromWideChar(target_path, result_length);
-    free(target_path);
+    PyMem_Free(target_path);
     return result;
 
 } /* end of posix__getfinalpathname */
index 067b775924d5a2afde1174f382325105a4da0e7f..1568002be4af7001cdee21d2c7ba172d70605768 100644 (file)
@@ -997,7 +997,7 @@ xmlparse_ExternalEntityParserCreate(xmlparseobject *self, PyObject *args)
     PyObject_GC_Track(new_parser);
 
     if (self->buffer != NULL) {
-        new_parser->buffer = malloc(new_parser->buffer_size);
+        new_parser->buffer = PyMem_Malloc(new_parser->buffer_size);
         if (new_parser->buffer == NULL) {
             Py_DECREF(new_parser);
             return PyErr_NoMemory();
@@ -1014,7 +1014,7 @@ xmlparse_ExternalEntityParserCreate(xmlparseobject *self, PyObject *args)
     for (i = 0; handler_info[i].name != NULL; i++)
         /* do nothing */;
 
-    new_parser->handlers = malloc(sizeof(PyObject *) * i);
+    new_parser->handlers = PyMem_Malloc(sizeof(PyObject *) * i);
     if (!new_parser->handlers) {
         Py_DECREF(new_parser);
         return PyErr_NoMemory();
@@ -1206,7 +1206,7 @@ newxmlparseobject(char *encoding, char *namespace_separator, PyObject *intern)
     for (i = 0; handler_info[i].name != NULL; i++)
         /* do nothing */;
 
-    self->handlers = malloc(sizeof(PyObject *) * i);
+    self->handlers = PyMem_Malloc(sizeof(PyObject *) * i);
     if (!self->handlers) {
         Py_DECREF(self);
         return PyErr_NoMemory();
@@ -1233,11 +1233,11 @@ xmlparse_dealloc(xmlparseobject *self)
             self->handlers[i] = NULL;
             Py_XDECREF(temp);
         }
-        free(self->handlers);
+        PyMem_Free(self->handlers);
         self->handlers = NULL;
     }
     if (self->buffer != NULL) {
-        free(self->buffer);
+        PyMem_Free(self->buffer);
         self->buffer = NULL;
     }
     Py_XDECREF(self->intern);
@@ -1437,7 +1437,7 @@ xmlparse_setattro(xmlparseobject *self, PyObject *name, PyObject *v)
             return -1;
         if (b) {
             if (self->buffer == NULL) {
-                self->buffer = malloc(self->buffer_size);
+                self->buffer = PyMem_Malloc(self->buffer_size);
                 if (self->buffer == NULL) {
                     PyErr_NoMemory();
                     return -1;
@@ -1448,7 +1448,7 @@ xmlparse_setattro(xmlparseobject *self, PyObject *name, PyObject *v)
         else if (self->buffer != NULL) {
             if (flush_character_buffer(self) < 0)
                 return -1;
-            free(self->buffer);
+            PyMem_Free(self->buffer);
             self->buffer = NULL;
         }
         return 0;
@@ -1508,9 +1508,9 @@ xmlparse_setattro(xmlparseobject *self, PyObject *name, PyObject *v)
           flush_character_buffer(self);
         }
         /* free existing buffer */
-        free(self->buffer);
+        PyMem_Free(self->buffer);
       }
-      self->buffer = malloc(new_buffer_size);
+      self->buffer = PyMem_Malloc(new_buffer_size);
       if (self->buffer == NULL) {
         PyErr_NoMemory();
         return -1;
index 5a14b5991aeccbe8c1c93bf2619e02558b59c05d..ffc29f6539dab077b1301bb1d31ad1900a3cbabf 100644 (file)
@@ -84,12 +84,12 @@ parse_and_bind(PyObject *self, PyObject *args)
         return NULL;
     /* Make a copy -- rl_parse_and_bind() modifies its argument */
     /* Bernard Herzog */
-    copy = malloc(1 + strlen(s));
+    copy = PyMem_Malloc(1 + strlen(s));
     if (copy == NULL)
         return PyErr_NoMemory();
     strcpy(copy, s);
     rl_parse_and_bind(copy);
-    free(copy); /* Free the copy */
+    PyMem_Free(copy); /* Free the copy */
     Py_RETURN_NONE;
 }
 
index 8100cbf2786cc3461009934c38690219db556825..30147aeef3bee4c5ab1d759d377b840399001f63 100644 (file)
@@ -165,7 +165,7 @@ PyZlib_compress(PyObject *self, PyObject *args)
 
     zst.avail_out = length + length/1000 + 12 + 1;
 
-    output = (Byte*)malloc(zst.avail_out);
+    output = (Byte*)PyMem_Malloc(zst.avail_out);
     if (output == NULL) {
         PyErr_SetString(PyExc_MemoryError,
                         "Can't allocate memory to compress data");
@@ -218,7 +218,7 @@ PyZlib_compress(PyObject *self, PyObject *args)
 
  error:
     PyBuffer_Release(&pinput);
-    free(output);
+    PyMem_Free(output);
 
     return ReturnVal;
 }
index a2511d52f35700cf2c9ac204866d880db4b6e86e..79f08a698e46ac26267bd50f10ccb6d14d7e47d8 100644 (file)
@@ -938,7 +938,7 @@ Reg2Py(BYTE *retDataBuf, DWORD retDataSize, DWORD typ)
                 wchar_t *data = (wchar_t *)retDataBuf;
                 int len = retDataSize / 2;
                 int s = countStrings(data, len);
-                wchar_t **str = (wchar_t **)malloc(sizeof(wchar_t *)*s);
+                wchar_t **str = (wchar_t **)PyMem_Malloc(sizeof(wchar_t *)*s);
                 if (str == NULL)
                     return PyErr_NoMemory();
 
@@ -959,7 +959,7 @@ Reg2Py(BYTE *retDataBuf, DWORD retDataSize, DWORD typ)
                                    index,
                                    PyUnicode_FromWideChar(str[index], len));
                 }
-                free(str);
+                PyMem_Free(str);
 
                 break;
             }