Commit 1a7425f6 authored by Victor Stinner's avatar Victor Stinner

Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization

* Replace malloc() with PyMem_RawMalloc()
* Replace PyMem_Malloc() with PyMem_RawMalloc() where the GIL is not held.
* _Py_char2wchar() now returns a buffer allocated by PyMem_RawMalloc(), instead
  of PyMem_Malloc()
parent 51fa458d
...@@ -343,7 +343,7 @@ search_for_prefix(wchar_t *argv0_path, wchar_t *home, wchar_t *_prefix) ...@@ -343,7 +343,7 @@ search_for_prefix(wchar_t *argv0_path, wchar_t *home, wchar_t *_prefix)
if (vpath != NULL) { if (vpath != NULL) {
wcscpy(prefix, argv0_path); wcscpy(prefix, argv0_path);
joinpath(prefix, vpath); joinpath(prefix, vpath);
PyMem_Free(vpath); PyMem_RawFree(vpath);
joinpath(prefix, L"Lib"); joinpath(prefix, L"Lib");
joinpath(prefix, LANDMARK); joinpath(prefix, LANDMARK);
if (ismodule(prefix)) if (ismodule(prefix))
...@@ -554,8 +554,7 @@ calculate_path(void) ...@@ -554,8 +554,7 @@ calculate_path(void)
} }
else else
progpath[0] = '\0'; progpath[0] = '\0';
if (path_buffer != NULL) PyMem_RawFree(path_buffer);
PyMem_Free(path_buffer);
if (progpath[0] != SEP && progpath[0] != '\0') if (progpath[0] != SEP && progpath[0] != '\0')
absolutize(progpath); absolutize(progpath);
wcsncpy(argv0_path, progpath, MAXPATHLEN); wcsncpy(argv0_path, progpath, MAXPATHLEN);
...@@ -597,7 +596,7 @@ calculate_path(void) ...@@ -597,7 +596,7 @@ calculate_path(void)
/* Use the location of the library as the progpath */ /* Use the location of the library as the progpath */
wcsncpy(argv0_path, wbuf, MAXPATHLEN); wcsncpy(argv0_path, wbuf, MAXPATHLEN);
} }
PyMem_Free(wbuf); PyMem_RawFree(wbuf);
} }
#endif #endif
...@@ -808,11 +807,10 @@ calculate_path(void) ...@@ -808,11 +807,10 @@ calculate_path(void)
else else
wcsncpy(exec_prefix, _exec_prefix, MAXPATHLEN); wcsncpy(exec_prefix, _exec_prefix, MAXPATHLEN);
PyMem_Free(_pythonpath); PyMem_RawFree(_pythonpath);
PyMem_Free(_prefix); PyMem_RawFree(_prefix);
PyMem_Free(_exec_prefix); PyMem_RawFree(_exec_prefix);
if (rtpypath != NULL) PyMem_RawFree(rtpypath);
PyMem_Free(rtpypath);
} }
...@@ -822,7 +820,7 @@ Py_SetPath(const wchar_t *path) ...@@ -822,7 +820,7 @@ Py_SetPath(const wchar_t *path)
{ {
if (module_search_path != NULL) { if (module_search_path != NULL) {
if (module_search_path_malloced) if (module_search_path_malloced)
PyMem_Free(module_search_path); PyMem_RawFree(module_search_path);
module_search_path = NULL; module_search_path = NULL;
module_search_path_malloced = 0; module_search_path_malloced = 0;
} }
...@@ -831,7 +829,7 @@ Py_SetPath(const wchar_t *path) ...@@ -831,7 +829,7 @@ Py_SetPath(const wchar_t *path)
wchar_t *prog = Py_GetProgramName(); wchar_t *prog = Py_GetProgramName();
wcsncpy(progpath, prog, MAXPATHLEN); wcsncpy(progpath, prog, MAXPATHLEN);
exec_prefix[0] = prefix[0] = L'\0'; exec_prefix[0] = prefix[0] = L'\0';
module_search_path = PyMem_Malloc((wcslen(path) + 1) * sizeof(wchar_t)); module_search_path = PyMem_RawMalloc((wcslen(path) + 1) * sizeof(wchar_t));
module_search_path_malloced = 1; module_search_path_malloced = 1;
if (module_search_path != NULL) if (module_search_path != NULL)
wcscpy(module_search_path, path); wcscpy(module_search_path, path);
......
...@@ -391,7 +391,7 @@ Py_Main(int argc, wchar_t **argv) ...@@ -391,7 +391,7 @@ Py_Main(int argc, wchar_t **argv)
command to interpret. */ command to interpret. */
len = wcslen(_PyOS_optarg) + 1 + 1; len = wcslen(_PyOS_optarg) + 1 + 1;
command = (wchar_t *)malloc(sizeof(wchar_t) * len); command = (wchar_t *)PyMem_RawMalloc(sizeof(wchar_t) * len);
if (command == NULL) if (command == NULL)
Py_FatalError( Py_FatalError(
"not enough memory to copy -c argument"); "not enough memory to copy -c argument");
...@@ -520,7 +520,7 @@ Py_Main(int argc, wchar_t **argv) ...@@ -520,7 +520,7 @@ Py_Main(int argc, wchar_t **argv)
*wp != L'\0') { *wp != L'\0') {
wchar_t *buf, *warning; wchar_t *buf, *warning;
buf = (wchar_t *)malloc((wcslen(wp) + 1) * sizeof(wchar_t)); buf = (wchar_t *)PyMem_RawMalloc((wcslen(wp) + 1) * sizeof(wchar_t));
if (buf == NULL) if (buf == NULL)
Py_FatalError( Py_FatalError(
"not enough memory to copy PYTHONWARNINGS"); "not enough memory to copy PYTHONWARNINGS");
...@@ -530,7 +530,7 @@ Py_Main(int argc, wchar_t **argv) ...@@ -530,7 +530,7 @@ Py_Main(int argc, wchar_t **argv)
warning = wcstok(NULL, L",")) { warning = wcstok(NULL, L",")) {
PySys_AddWarnOption(warning); PySys_AddWarnOption(warning);
} }
free(buf); PyMem_RawFree(buf);
} }
#else #else
if ((p = Py_GETENV("PYTHONWARNINGS")) && *p != '\0') { if ((p = Py_GETENV("PYTHONWARNINGS")) && *p != '\0') {
...@@ -539,7 +539,7 @@ Py_Main(int argc, wchar_t **argv) ...@@ -539,7 +539,7 @@ Py_Main(int argc, wchar_t **argv)
/* settle for strtok here as there's no one standard /* settle for strtok here as there's no one standard
C89 wcstok */ C89 wcstok */
buf = (char *)malloc(strlen(p) + 1); buf = (char *)PyMem_RawMalloc(strlen(p) + 1);
if (buf == NULL) if (buf == NULL)
Py_FatalError( Py_FatalError(
"not enough memory to copy PYTHONWARNINGS"); "not enough memory to copy PYTHONWARNINGS");
...@@ -563,7 +563,7 @@ Py_Main(int argc, wchar_t **argv) ...@@ -563,7 +563,7 @@ Py_Main(int argc, wchar_t **argv)
} }
setlocale(LC_ALL, oldloc); setlocale(LC_ALL, oldloc);
free(oldloc); free(oldloc);
free(buf); PyMem_RawFree(buf);
} }
#endif #endif
...@@ -633,7 +633,7 @@ Py_Main(int argc, wchar_t **argv) ...@@ -633,7 +633,7 @@ Py_Main(int argc, wchar_t **argv)
wchar_t* buffer; wchar_t* buffer;
size_t len = strlen(p) + 1; size_t len = strlen(p) + 1;
buffer = malloc(len * sizeof(wchar_t)); buffer = PyMem_RawMalloc(len * sizeof(wchar_t));
if (buffer == NULL) { if (buffer == NULL) {
Py_FatalError( Py_FatalError(
"not enough memory to copy PYTHONEXECUTABLE"); "not enough memory to copy PYTHONEXECUTABLE");
...@@ -707,7 +707,7 @@ Py_Main(int argc, wchar_t **argv) ...@@ -707,7 +707,7 @@ Py_Main(int argc, wchar_t **argv)
if (command) { if (command) {
sts = run_command(command, &cf); sts = run_command(command, &cf);
free(command); PyMem_RawFree(command);
} else if (module) { } else if (module) {
sts = (RunModule(module, 1) != 0); sts = (RunModule(module, 1) != 0);
} }
......
...@@ -18,11 +18,19 @@ wmain(int argc, wchar_t **argv) ...@@ -18,11 +18,19 @@ wmain(int argc, wchar_t **argv)
int int
main(int argc, char **argv) main(int argc, char **argv)
{ {
wchar_t **argv_copy = (wchar_t **)PyMem_Malloc(sizeof(wchar_t*)*(argc+1)); wchar_t **argv_copy;
/* We need a second copies, as Python might modify the first one. */ /* We need a second copies, as Python might modify the first one. */
wchar_t **argv_copy2 = (wchar_t **)PyMem_Malloc(sizeof(wchar_t*)*(argc+1)); wchar_t **argv_copy2;
int i, res; int i, res;
char *oldloc; char *oldloc;
argv_copy = (wchar_t **)PyMem_RawMalloc(sizeof(wchar_t*) * (argc+1));
argv_copy2 = (wchar_t **)PyMem_RawMalloc(sizeof(wchar_t*) * (argc+1));
if (!argv_copy || !argv_copy2) {
fprintf(stderr, "out of memory\n");
return 1;
}
/* 754 requires that FP exceptions run in "no stop" mode by default, /* 754 requires that FP exceptions run in "no stop" mode by default,
* and until C vendors implement C99's ways to control FP exceptions, * and until C vendors implement C99's ways to control FP exceptions,
* Python requires non-stop mode. Alas, some platforms enable FP * Python requires non-stop mode. Alas, some platforms enable FP
...@@ -34,10 +42,7 @@ main(int argc, char **argv) ...@@ -34,10 +42,7 @@ main(int argc, char **argv)
m = fpgetmask(); m = fpgetmask();
fpsetmask(m & ~FP_X_OFL); fpsetmask(m & ~FP_X_OFL);
#endif #endif
if (!argv_copy || !argv_copy2) {
fprintf(stderr, "out of memory\n");
return 1;
}
oldloc = strdup(setlocale(LC_ALL, NULL)); oldloc = strdup(setlocale(LC_ALL, NULL));
setlocale(LC_ALL, ""); setlocale(LC_ALL, "");
for (i = 0; i < argc; i++) { for (i = 0; i < argc; i++) {
...@@ -57,10 +62,10 @@ main(int argc, char **argv) ...@@ -57,10 +62,10 @@ main(int argc, char **argv)
free(oldloc); free(oldloc);
res = Py_Main(argc, argv_copy); res = Py_Main(argc, argv_copy);
for (i = 0; i < argc; i++) { for (i = 0; i < argc; i++) {
PyMem_Free(argv_copy2[i]); PyMem_RawFree(argv_copy2[i]);
} }
PyMem_Free(argv_copy); PyMem_RawFree(argv_copy);
PyMem_Free(argv_copy2); PyMem_RawFree(argv_copy2);
return res; return res;
} }
#endif #endif
...@@ -3316,7 +3316,7 @@ encode_error: ...@@ -3316,7 +3316,7 @@ encode_error:
wstr = _Py_char2wchar(errmsg, &errlen); wstr = _Py_char2wchar(errmsg, &errlen);
if (wstr != NULL) { if (wstr != NULL) {
reason = PyUnicode_FromWideChar(wstr, errlen); reason = PyUnicode_FromWideChar(wstr, errlen);
PyMem_Free(wstr); PyMem_RawFree(wstr);
} else } else
errmsg = NULL; errmsg = NULL;
} }
...@@ -3535,7 +3535,7 @@ PyUnicode_DecodeLocaleAndSize(const char *str, Py_ssize_t len, ...@@ -3535,7 +3535,7 @@ PyUnicode_DecodeLocaleAndSize(const char *str, Py_ssize_t len,
} }
unicode = PyUnicode_FromWideChar(wstr, wlen); unicode = PyUnicode_FromWideChar(wstr, wlen);
PyMem_Free(wstr); PyMem_RawFree(wstr);
} }
else { else {
/* strict mode */ /* strict mode */
...@@ -3583,7 +3583,7 @@ decode_error: ...@@ -3583,7 +3583,7 @@ decode_error:
wstr = _Py_char2wchar(errmsg, &errlen); wstr = _Py_char2wchar(errmsg, &errlen);
if (wstr != NULL) { if (wstr != NULL) {
reason = PyUnicode_FromWideChar(wstr, errlen); reason = PyUnicode_FromWideChar(wstr, errlen);
PyMem_Free(wstr); PyMem_RawFree(wstr);
} else } else
errmsg = NULL; errmsg = NULL;
} }
......
...@@ -245,9 +245,9 @@ getpythonregpath(HKEY keyBase, int skipcore) ...@@ -245,9 +245,9 @@ getpythonregpath(HKEY keyBase, int skipcore)
/* Tried to use sysget("winver") but here is too early :-( */ /* Tried to use sysget("winver") but here is too early :-( */
versionLen = strlen(PyWin_DLLVersionString); versionLen = strlen(PyWin_DLLVersionString);
/* Space for all the chars, plus one \0 */ /* Space for all the chars, plus one \0 */
keyBuf = keyBufPtr = malloc(sizeof(keyPrefix) + keyBuf = keyBufPtr = PyMem_RawMalloc(sizeof(keyPrefix) +
sizeof(WCHAR)*(versionLen-1) + sizeof(WCHAR)*(versionLen-1) +
sizeof(keySuffix)); sizeof(keySuffix));
if (keyBuf==NULL) goto done; if (keyBuf==NULL) goto done;
memcpy(keyBufPtr, keyPrefix, sizeof(keyPrefix)-sizeof(WCHAR)); memcpy(keyBufPtr, keyPrefix, sizeof(keyPrefix)-sizeof(WCHAR));
...@@ -271,7 +271,7 @@ getpythonregpath(HKEY keyBase, int skipcore) ...@@ -271,7 +271,7 @@ getpythonregpath(HKEY keyBase, int skipcore)
/* Allocate a temp array of char buffers, so we only need to loop /* Allocate a temp array of char buffers, so we only need to loop
reading the registry once reading the registry once
*/ */
ppPaths = malloc( sizeof(WCHAR *) * numKeys ); ppPaths = PyMem_RawMalloc( sizeof(WCHAR *) * numKeys );
if (ppPaths==NULL) goto done; if (ppPaths==NULL) goto done;
memset(ppPaths, 0, sizeof(WCHAR *) * numKeys); memset(ppPaths, 0, sizeof(WCHAR *) * numKeys);
/* Loop over all subkeys, allocating a temp sub-buffer. */ /* Loop over all subkeys, allocating a temp sub-buffer. */
...@@ -293,7 +293,7 @@ getpythonregpath(HKEY keyBase, int skipcore) ...@@ -293,7 +293,7 @@ getpythonregpath(HKEY keyBase, int skipcore)
/* Find the value of the buffer size, malloc, then read it */ /* Find the value of the buffer size, malloc, then read it */
RegQueryValueExW(subKey, NULL, 0, NULL, NULL, &reqdSize); RegQueryValueExW(subKey, NULL, 0, NULL, NULL, &reqdSize);
if (reqdSize) { if (reqdSize) {
ppPaths[index] = malloc(reqdSize); ppPaths[index] = PyMem_RawMalloc(reqdSize);
if (ppPaths[index]) { if (ppPaths[index]) {
RegQueryValueExW(subKey, NULL, 0, NULL, RegQueryValueExW(subKey, NULL, 0, NULL,
(LPBYTE)ppPaths[index], (LPBYTE)ppPaths[index],
...@@ -308,7 +308,7 @@ getpythonregpath(HKEY keyBase, int skipcore) ...@@ -308,7 +308,7 @@ getpythonregpath(HKEY keyBase, int skipcore)
if (dataSize == 0) goto done; if (dataSize == 0) goto done;
/* original datasize from RegQueryInfo doesn't include the \0 */ /* original datasize from RegQueryInfo doesn't include the \0 */
dataBuf = malloc((dataSize+1) * sizeof(WCHAR)); dataBuf = PyMem_RawMalloc((dataSize+1) * sizeof(WCHAR));
if (dataBuf) { if (dataBuf) {
WCHAR *szCur = dataBuf; WCHAR *szCur = dataBuf;
DWORD reqdSize = dataSize; DWORD reqdSize = dataSize;
...@@ -346,14 +346,13 @@ getpythonregpath(HKEY keyBase, int skipcore) ...@@ -346,14 +346,13 @@ getpythonregpath(HKEY keyBase, int skipcore)
done: done:
/* Loop freeing my temp buffers */ /* Loop freeing my temp buffers */
if (ppPaths) { if (ppPaths) {
for(index=0;index<numKeys;index++) for(index=0; index<numKeys; index++)
if (ppPaths[index]) free(ppPaths[index]); PyMem_RawFree(ppPaths[index]);
free(ppPaths); PyMem_RawFree(ppPaths);
} }
if (newKey) if (newKey)
RegCloseKey(newKey); RegCloseKey(newKey);
if (keyBuf) PyMem_RawFree(keyBuf);
free(keyBuf);
return retval; return retval;
} }
#endif /* Py_ENABLE_SHARED */ #endif /* Py_ENABLE_SHARED */
...@@ -616,7 +615,7 @@ calculate_path(void) ...@@ -616,7 +615,7 @@ calculate_path(void)
if (envpath != NULL) if (envpath != NULL)
bufsz += wcslen(envpath) + 1; bufsz += wcslen(envpath) + 1;
module_search_path = buf = malloc(bufsz*sizeof(wchar_t)); module_search_path = buf = PyMem_RawMalloc(bufsz*sizeof(wchar_t));
if (buf == NULL) { if (buf == NULL) {
/* We can't exit, so print a warning and limp along */ /* We can't exit, so print a warning and limp along */
fprintf(stderr, "Can't malloc dynamic PYTHONPATH.\n"); fprintf(stderr, "Can't malloc dynamic PYTHONPATH.\n");
...@@ -629,10 +628,8 @@ calculate_path(void) ...@@ -629,10 +628,8 @@ calculate_path(void)
module_search_path = PYTHONPATH; module_search_path = PYTHONPATH;
} }
#ifdef MS_WINDOWS #ifdef MS_WINDOWS
if (machinepath) PyMem_RawFree(machinepath);
free(machinepath); PyMem_RawFree(userpath);
if (userpath)
free(userpath);
#endif /* MS_WINDOWS */ #endif /* MS_WINDOWS */
return; return;
} }
...@@ -652,13 +649,13 @@ calculate_path(void) ...@@ -652,13 +649,13 @@ calculate_path(void)
wcscpy(buf, userpath); wcscpy(buf, userpath);
buf = wcschr(buf, L'\0'); buf = wcschr(buf, L'\0');
*buf++ = DELIM; *buf++ = DELIM;
free(userpath); PyMem_RawFree(userpath);
} }
if (machinepath) { if (machinepath) {
wcscpy(buf, machinepath); wcscpy(buf, machinepath);
buf = wcschr(buf, L'\0'); buf = wcschr(buf, L'\0');
*buf++ = DELIM; *buf++ = DELIM;
free(machinepath); PyMem_RawFree(machinepath);
} }
if (pythonhome == NULL) { if (pythonhome == NULL) {
if (!skipdefault) { if (!skipdefault) {
...@@ -745,7 +742,7 @@ void ...@@ -745,7 +742,7 @@ void
Py_SetPath(const wchar_t *path) Py_SetPath(const wchar_t *path)
{ {
if (module_search_path != NULL) { if (module_search_path != NULL) {
free(module_search_path); PyMem_RawFree(module_search_path);
module_search_path = NULL; module_search_path = NULL;
} }
if (path != NULL) { if (path != NULL) {
...@@ -753,10 +750,10 @@ Py_SetPath(const wchar_t *path) ...@@ -753,10 +750,10 @@ Py_SetPath(const wchar_t *path)
wchar_t *prog = Py_GetProgramName(); wchar_t *prog = Py_GetProgramName();
wcsncpy(progpath, prog, MAXPATHLEN); wcsncpy(progpath, prog, MAXPATHLEN);
prefix[0] = L'\0'; prefix[0] = L'\0';
module_search_path = malloc((wcslen(path) + 1) * sizeof(wchar_t)); module_search_path = PyMem_RawMalloc((wcslen(path) + 1) * sizeof(wchar_t));
if (module_search_path != NULL) if (module_search_path != NULL)
wcscpy(module_search_path, path); wcscpy(module_search_path, path);
} }
} }
wchar_t * wchar_t *
......
...@@ -229,7 +229,7 @@ decode_ascii_surrogateescape(const char *arg, size_t *size) ...@@ -229,7 +229,7 @@ decode_ascii_surrogateescape(const char *arg, size_t *size)
Use _Py_wchar2char() to encode the character string back to a byte string. Use _Py_wchar2char() to encode the character string back to a byte string.
Return a pointer to a newly allocated wide character string (use Return a pointer to a newly allocated wide character string (use
PyMem_Free() to free the memory) and write the number of written wide PyMem_RawFree() to free the memory) and write the number of written wide
characters excluding the null character into *size if size is not NULL, or characters excluding the null character into *size if size is not NULL, or
NULL on error (decoding or memory allocation error). If size is not NULL, NULL on error (decoding or memory allocation error). If size is not NULL,
*size is set to (size_t)-1 on memory error and (size_t)-2 on decoding *size is set to (size_t)-1 on memory error and (size_t)-2 on decoding
...@@ -283,7 +283,7 @@ _Py_char2wchar(const char* arg, size_t *size) ...@@ -283,7 +283,7 @@ _Py_char2wchar(const char* arg, size_t *size)
argsize = mbstowcs(NULL, arg, 0); argsize = mbstowcs(NULL, arg, 0);
#endif #endif
if (argsize != (size_t)-1) { if (argsize != (size_t)-1) {
res = (wchar_t *)PyMem_Malloc((argsize+1)*sizeof(wchar_t)); res = (wchar_t *)PyMem_RawMalloc((argsize+1)*sizeof(wchar_t));
if (!res) if (!res)
goto oom; goto oom;
count = mbstowcs(res, arg, argsize+1); count = mbstowcs(res, arg, argsize+1);
...@@ -300,7 +300,7 @@ _Py_char2wchar(const char* arg, size_t *size) ...@@ -300,7 +300,7 @@ _Py_char2wchar(const char* arg, size_t *size)
return res; return res;
} }
} }
PyMem_Free(res); PyMem_RawFree(res);
} }
/* Conversion failed. Fall back to escaping with surrogateescape. */ /* Conversion failed. Fall back to escaping with surrogateescape. */
#ifdef HAVE_MBRTOWC #ifdef HAVE_MBRTOWC
...@@ -309,7 +309,7 @@ _Py_char2wchar(const char* arg, size_t *size) ...@@ -309,7 +309,7 @@ _Py_char2wchar(const char* arg, size_t *size)
/* Overallocate; as multi-byte characters are in the argument, the /* Overallocate; as multi-byte characters are in the argument, the
actual output could use less memory. */ actual output could use less memory. */
argsize = strlen(arg) + 1; argsize = strlen(arg) + 1;
res = (wchar_t*)PyMem_Malloc(argsize*sizeof(wchar_t)); res = (wchar_t*)PyMem_RawMalloc(argsize*sizeof(wchar_t));
if (!res) if (!res)
goto oom; goto oom;
in = (unsigned char*)arg; in = (unsigned char*)arg;
...@@ -325,7 +325,7 @@ _Py_char2wchar(const char* arg, size_t *size) ...@@ -325,7 +325,7 @@ _Py_char2wchar(const char* arg, size_t *size)
since we provide everything that we have - since we provide everything that we have -
unless there is a bug in the C library, or I unless there is a bug in the C library, or I
misunderstood how mbrtowc works. */ misunderstood how mbrtowc works. */
PyMem_Free(res); PyMem_RawFree(res);
if (size != NULL) if (size != NULL)
*size = (size_t)-2; *size = (size_t)-2;
return NULL; return NULL;
...@@ -648,12 +648,12 @@ _Py_wreadlink(const wchar_t *path, wchar_t *buf, size_t bufsiz) ...@@ -648,12 +648,12 @@ _Py_wreadlink(const wchar_t *path, wchar_t *buf, size_t bufsiz)
return -1; return -1;
} }
if (bufsiz <= r1) { if (bufsiz <= r1) {
PyMem_Free(wbuf); PyMem_RawFree(wbuf);
errno = EINVAL; errno = EINVAL;
return -1; return -1;
} }
wcsncpy(buf, wbuf, bufsiz); wcsncpy(buf, wbuf, bufsiz);
PyMem_Free(wbuf); PyMem_RawFree(wbuf);
return (int)r1; return (int)r1;
} }
#endif #endif
...@@ -689,12 +689,12 @@ _Py_wrealpath(const wchar_t *path, ...@@ -689,12 +689,12 @@ _Py_wrealpath(const wchar_t *path,
return NULL; return NULL;
} }
if (resolved_path_size <= r) { if (resolved_path_size <= r) {
PyMem_Free(wresolved_path); PyMem_RawFree(wresolved_path);
errno = EINVAL; errno = EINVAL;
return NULL; return NULL;
} }
wcsncpy(resolved_path, wresolved_path, resolved_path_size); wcsncpy(resolved_path, wresolved_path, resolved_path_size);
PyMem_Free(wresolved_path); PyMem_RawFree(wresolved_path);
return resolved_path; return resolved_path;
} }
#endif #endif
...@@ -720,11 +720,11 @@ _Py_wgetcwd(wchar_t *buf, size_t size) ...@@ -720,11 +720,11 @@ _Py_wgetcwd(wchar_t *buf, size_t size)
if (wname == NULL) if (wname == NULL)
return NULL; return NULL;
if (size <= len) { if (size <= len) {
PyMem_Free(wname); PyMem_RawFree(wname);
return NULL; return NULL;
} }
wcsncpy(buf, wname, size); wcsncpy(buf, wname, size);
PyMem_Free(wname); PyMem_RawFree(wname);
return buf; return buf;
#endif #endif
} }
......
...@@ -6,11 +6,11 @@ ...@@ -6,11 +6,11 @@
/* -------------------------------------------------------------------------- /* --------------------------------------------------------------------------
CAUTION CAUTION
Always use malloc() and free() directly in this file. A number of these Always use PyMem_RawMalloc() and PyMem_RawFree() directly in this file. A
functions are advertised as safe to call when the GIL isn't held, and in number of these functions are advertised as safe to call when the GIL isn't
a debug build Python redirects (e.g.) PyMem_NEW (etc) to Python's debugging held, and in a debug build Python redirects (e.g.) PyMem_NEW (etc) to Python's
obmalloc functions. Those aren't thread-safe (they rely on the GIL to avoid debugging obmalloc functions. Those aren't thread-safe (they rely on the GIL
the expense of doing their own locking). to avoid the expense of doing their own locking).
-------------------------------------------------------------------------- */ -------------------------------------------------------------------------- */
#ifdef HAVE_DLOPEN #ifdef HAVE_DLOPEN
...@@ -60,7 +60,7 @@ PyInterpreterState * ...@@ -60,7 +60,7 @@ PyInterpreterState *
PyInterpreterState_New(void) PyInterpreterState_New(void)
{ {
PyInterpreterState *interp = (PyInterpreterState *) PyInterpreterState *interp = (PyInterpreterState *)
malloc(sizeof(PyInterpreterState)); PyMem_RawMalloc(sizeof(PyInterpreterState));
if (interp != NULL) { if (interp != NULL) {
HEAD_INIT(); HEAD_INIT();
...@@ -148,7 +148,7 @@ PyInterpreterState_Delete(PyInterpreterState *interp) ...@@ -148,7 +148,7 @@ PyInterpreterState_Delete(PyInterpreterState *interp)
Py_FatalError("PyInterpreterState_Delete: remaining threads"); Py_FatalError("PyInterpreterState_Delete: remaining threads");
*p = interp->next; *p = interp->next;
HEAD_UNLOCK(); HEAD_UNLOCK();
free(interp); PyMem_RawFree(interp);
#ifdef WITH_THREAD #ifdef WITH_THREAD
if (interp_head == NULL && head_mutex != NULL) { if (interp_head == NULL && head_mutex != NULL) {
PyThread_free_lock(head_mutex); PyThread_free_lock(head_mutex);
...@@ -168,7 +168,7 @@ threadstate_getframe(PyThreadState *self) ...@@ -168,7 +168,7 @@ threadstate_getframe(PyThreadState *self)
static PyThreadState * static PyThreadState *
new_threadstate(PyInterpreterState *interp, int init) new_threadstate(PyInterpreterState *interp, int init)
{ {
PyThreadState *tstate = (PyThreadState *)malloc(sizeof(PyThreadState)); PyThreadState *tstate = (PyThreadState *)PyMem_RawMalloc(sizeof(PyThreadState));
if (_PyThreadState_GetFrame == NULL) if (_PyThreadState_GetFrame == NULL)
_PyThreadState_GetFrame = threadstate_getframe; _PyThreadState_GetFrame = threadstate_getframe;
...@@ -365,7 +365,7 @@ tstate_delete_common(PyThreadState *tstate) ...@@ -365,7 +365,7 @@ tstate_delete_common(PyThreadState *tstate)
if (tstate->next) if (tstate->next)
tstate->next->prev = tstate->prev; tstate->next->prev = tstate->prev;
HEAD_UNLOCK(); HEAD_UNLOCK();
free(tstate); PyMem_RawFree(tstate);
} }
...@@ -432,7 +432,7 @@ _PyThreadState_DeleteExcept(PyThreadState *tstate) ...@@ -432,7 +432,7 @@ _PyThreadState_DeleteExcept(PyThreadState *tstate)
for (p = garbage; p; p = next) { for (p = garbage; p; p = next) {
next = p->next; next = p->next;
PyThreadState_Clear(p); PyThreadState_Clear(p);
free(p); PyMem_RawFree(p);
} }
} }
......
...@@ -231,7 +231,7 @@ find_key(int key, void *value) ...@@ -231,7 +231,7 @@ find_key(int key, void *value)
assert(p == NULL); assert(p == NULL);
goto Done; goto Done;
} }
p = (struct key *)malloc(sizeof(struct key)); p = (struct key *)PyMem_RawMalloc(sizeof(struct key));
if (p != NULL) { if (p != NULL) {
p->id = id; p->id = id;
p->key = key; p->key = key;
...@@ -270,7 +270,7 @@ PyThread_delete_key(int key) ...@@ -270,7 +270,7 @@ PyThread_delete_key(int key)
while ((p = *q) != NULL) { while ((p = *q) != NULL) {
if (p->key == key) { if (p->key == key) {
*q = p->next; *q = p->next;
free((void *)p); PyMem_RawFree((void *)p);
/* NB This does *not* free p->value! */ /* NB This does *not* free p->value! */
} }
else else
...@@ -324,7 +324,7 @@ PyThread_delete_key_value(int key) ...@@ -324,7 +324,7 @@ PyThread_delete_key_value(int key)
while ((p = *q) != NULL) { while ((p = *q) != NULL) {
if (p->key == key && p->id == id) { if (p->key == key && p->id == id) {
*q = p->next; *q = p->next;
free((void *)p); PyMem_RawFree((void *)p);
/* NB This does *not* free p->value! */ /* NB This does *not* free p->value! */
break; break;
} }
...@@ -357,7 +357,7 @@ PyThread_ReInitTLS(void) ...@@ -357,7 +357,7 @@ PyThread_ReInitTLS(void)
while ((p = *q) != NULL) { while ((p = *q) != NULL) {
if (p->id != id) { if (p->id != id) {
*q = p->next; *q = p->next;
free((void *)p); PyMem_RawFree((void *)p);
/* NB This does *not* free p->value! */ /* NB This does *not* free p->value! */
} }
else else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment