diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2013-07-07 14:21:41 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2013-07-07 14:21:41 (GMT) |
commit | b64049183cee61edc112eefa3ca76916d03e9f02 (patch) | |
tree | fd0be14ac288739314a5108c6e21879f641b0b40 | |
parent | 1a7425f67a0d141483d89ca80ca01e3cb7f6be92 (diff) | |
download | cpython-b64049183cee61edc112eefa3ca76916d03e9f02.zip cpython-b64049183cee61edc112eefa3ca76916d03e9f02.tar.gz cpython-b64049183cee61edc112eefa3ca76916d03e9f02.tar.bz2 |
Issue #18203: Replace malloc() with PyMem_Malloc() in Python modules
Replace malloc() with PyMem_Malloc() when the GIL is held, or with
PyMem_RawMalloc() otherwise.
-rw-r--r-- | Modules/_curses_panel.c | 6 | ||||
-rw-r--r-- | Modules/_cursesmodule.c | 4 | ||||
-rw-r--r-- | Modules/_lsprof.c | 18 | ||||
-rw-r--r-- | Modules/_ssl.c | 4 | ||||
-rw-r--r-- | Modules/audioop.c | 10 | ||||
-rw-r--r-- | Modules/posixmodule.c | 35 | ||||
-rw-r--r-- | Modules/pyexpat.c | 18 | ||||
-rw-r--r-- | Modules/readline.c | 4 | ||||
-rw-r--r-- | Modules/zlibmodule.c | 4 | ||||
-rw-r--r-- | PC/winreg.c | 4 |
10 files changed, 52 insertions, 55 deletions
diff --git a/Modules/_curses_panel.c b/Modules/_curses_panel.c index f560702..3e9fffd 100644 --- a/Modules/_curses_panel.c +++ b/Modules/_curses_panel.c @@ -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; } diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index dff1a17..fbe18f6 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -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); diff --git a/Modules/_lsprof.c b/Modules/_lsprof.c index 5657f2f..fef255f 100644 --- a/Modules/_lsprof.c +++ b/Modules/_lsprof.c @@ -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); } } diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 1d7ddcb..ff3ef9e 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -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; } } diff --git a/Modules/audioop.c b/Modules/audioop.c index 4f2b25f..7175cec 100644 --- a/Modules/audioop.c +++ b/Modules/audioop.c @@ -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; } diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 226a4d5..a9a64fa 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -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 */ diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c index 067b775..1568002 100644 --- a/Modules/pyexpat.c +++ b/Modules/pyexpat.c @@ -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; diff --git a/Modules/readline.c b/Modules/readline.c index 5a14b59..ffc29f6 100644 --- a/Modules/readline.c +++ b/Modules/readline.c @@ -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; } diff --git a/Modules/zlibmodule.c b/Modules/zlibmodule.c index 8100cbf..30147ae 100644 --- a/Modules/zlibmodule.c +++ b/Modules/zlibmodule.c @@ -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; } diff --git a/PC/winreg.c b/PC/winreg.c index a2511d5..79f08a6 100644 --- a/PC/winreg.c +++ b/PC/winreg.c @@ -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; } |