Make uenvarea thread exclusive

This commit is contained in:
Nobuyoshi Nakada 2021-02-23 20:51:02 +09:00
parent 41eb4fbf86
commit 5a4742a0b4
No known key found for this signature in database
GPG Key ID: 7CD2805BFA3770C6

View File

@ -750,10 +750,13 @@ exit_handler(void)
DeleteCriticalSection(&select_mutex); DeleteCriticalSection(&select_mutex);
DeleteCriticalSection(&socklist_mutex); DeleteCriticalSection(&socklist_mutex);
DeleteCriticalSection(&conlist_mutex); DeleteCriticalSection(&conlist_mutex);
if (uenvarea) { thread_exclusive(uenvarea) {
free(uenvarea); if (uenvarea) {
uenvarea = NULL; free(uenvarea);
uenvarea = NULL;
}
} }
DeleteCriticalSection(&uenvarea_mutex);
} }
/* License: Ruby's */ /* License: Ruby's */
@ -808,6 +811,7 @@ StartSockets(void)
InitializeCriticalSection(&select_mutex); InitializeCriticalSection(&select_mutex);
InitializeCriticalSection(&socklist_mutex); InitializeCriticalSection(&socklist_mutex);
InitializeCriticalSection(&conlist_mutex); InitializeCriticalSection(&conlist_mutex);
InitializeCriticalSection(&uenvarea_mutex);
atexit(exit_handler); atexit(exit_handler);
} }
@ -5261,32 +5265,37 @@ w32_getenv(const char *name, UINT cp)
{ {
WCHAR *wenvarea, *wenv; WCHAR *wenvarea, *wenv;
int len = strlen(name); int len = strlen(name);
char *env; char *env = NULL;
int wlen; int wlen;
if (len == 0) return NULL; if (len == 0) return NULL;
if (uenvarea) { thread_exclusive(uenvarea) {
free(uenvarea); if (uenvarea) {
uenvarea = NULL; free(uenvarea);
} uenvarea = NULL;
wenvarea = GetEnvironmentStringsW(); }
if (!wenvarea) { wenvarea = GetEnvironmentStringsW();
map_errno(GetLastError()); if (!wenvarea) {
return NULL; map_errno(GetLastError());
} continue;
for (wenv = wenvarea, wlen = 1; *wenv; wenv += lstrlenW(wenv) + 1) }
wlen += lstrlenW(wenv) + 1; for (wenv = wenvarea, wlen = 1; *wenv; wenv += lstrlenW(wenv) + 1)
uenvarea = wstr_to_mbstr(cp, wenvarea, wlen, NULL); wlen += lstrlenW(wenv) + 1;
FreeEnvironmentStringsW(wenvarea); uenvarea = wstr_to_mbstr(cp, wenvarea, wlen, NULL);
if (!uenvarea) FreeEnvironmentStringsW(wenvarea);
return NULL; if (!uenvarea)
continue;
for (env = uenvarea; *env; env += strlen(env) + 1) for (env = uenvarea; *env; env += strlen(env) + 1) {
if (strncasecmp(env, name, len) == 0 && *(env + len) == '=') if (strncasecmp(env, name, len) == 0 && *(env + len) == '=') {
return env + len + 1; env += len + 1;
break;
}
}
}
return NULL; return env;
} }
/* License: Ruby's */ /* License: Ruby's */