summaryrefslogtreecommitdiff
path: root/src/classlibnative
diff options
context:
space:
mode:
authorJan Kotas <jkotas@microsoft.com>2019-02-07 18:35:15 -0800
committerGitHub <noreply@github.com>2019-02-07 18:35:15 -0800
commitb1f73285236049c8e922ff6652e2a917db89454f (patch)
treee0b2f32ff7169067ea3b67ab9d9eedf1eee19522 /src/classlibnative
parent19ed7168345d34336cbc5a334b3fca36046a1af1 (diff)
downloadcoreclr-b1f73285236049c8e922ff6652e2a917db89454f.tar.gz
coreclr-b1f73285236049c8e922ff6652e2a917db89454f.tar.bz2
coreclr-b1f73285236049c8e922ff6652e2a917db89454f.zip
Fix race condition in g_pfnGetSystemTimeAsFileTime initialization (#22466)
Multiple threads initializing g_pfnGetSystemTimeAsFileTime at the same time can end up with different conclusions. Make the result consistent.
Diffstat (limited to 'src/classlibnative')
-rw-r--r--src/classlibnative/bcltype/system.cpp13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/classlibnative/bcltype/system.cpp b/src/classlibnative/bcltype/system.cpp
index 944cda0837..37c8b11387 100644
--- a/src/classlibnative/bcltype/system.cpp
+++ b/src/classlibnative/bcltype/system.cpp
@@ -31,6 +31,7 @@
#include "array.h"
#include "eepolicy.h"
+#ifndef FEATURE_PAL
typedef void(WINAPI *pfnGetSystemTimeAsFileTime)(LPFILETIME lpSystemTimeAsFileTime);
extern pfnGetSystemTimeAsFileTime g_pfnGetSystemTimeAsFileTime;
@@ -38,7 +39,6 @@ void WINAPI InitializeGetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime)
{
pfnGetSystemTimeAsFileTime func = NULL;
-#ifndef FEATURE_PAL
HMODULE hKernel32 = WszLoadLibrary(W("kernel32.dll"));
if (hKernel32 != NULL)
{
@@ -72,23 +72,28 @@ void WINAPI InitializeGetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime)
}
}
if (func == NULL)
-#endif
{
func = &::GetSystemTimeAsFileTime;
}
- g_pfnGetSystemTimeAsFileTime = func;
- func(lpSystemTimeAsFileTime);
+ InterlockedCompareExchangeT(&g_pfnGetSystemTimeAsFileTime, func, &InitializeGetSystemTimeAsFileTime);
+
+ g_pfnGetSystemTimeAsFileTime(lpSystemTimeAsFileTime);
}
pfnGetSystemTimeAsFileTime g_pfnGetSystemTimeAsFileTime = &InitializeGetSystemTimeAsFileTime;
+#endif // FEATURE_PAL
FCIMPL0(INT64, SystemNative::__GetSystemTimeAsFileTime)
{
FCALL_CONTRACT;
INT64 timestamp;
+#ifndef FEATURE_PAL
g_pfnGetSystemTimeAsFileTime((FILETIME*)&timestamp);
+#else
+ GetSystemTimeAsFileTime((FILETIME*)&timestamp);
+#endif
#if BIGENDIAN
timestamp = (INT64)(((UINT64)timestamp >> 32) | ((UINT64)timestamp << 32));