diff options
author | Jan Kotas <jkotas@microsoft.com> | 2019-02-07 18:35:15 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-02-07 18:35:15 -0800 |
commit | b1f73285236049c8e922ff6652e2a917db89454f (patch) | |
tree | e0b2f32ff7169067ea3b67ab9d9eedf1eee19522 /src/classlibnative | |
parent | 19ed7168345d34336cbc5a334b3fca36046a1af1 (diff) | |
download | coreclr-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.cpp | 13 |
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*)×tamp); +#else + GetSystemTimeAsFileTime((FILETIME*)×tamp); +#endif #if BIGENDIAN timestamp = (INT64)(((UINT64)timestamp >> 32) | ((UINT64)timestamp << 32)); |