Skip to content
This repository has been archived by the owner on Jan 23, 2023. It is now read-only.

Commit

Permalink
Fix race condition in g_pfnGetSystemTimeAsFileTime initialization (#2…
Browse files Browse the repository at this point in the history
…2466)

Multiple threads initializing g_pfnGetSystemTimeAsFileTime at the same time can end up with different conclusions. Make the result consistent.
  • Loading branch information
jkotas authored Feb 8, 2019
1 parent 19ed716 commit b1f7328
Showing 1 changed file with 9 additions and 4 deletions.
13 changes: 9 additions & 4 deletions src/classlibnative/bcltype/system.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,14 @@
#include "array.h"
#include "eepolicy.h"

#ifndef FEATURE_PAL
typedef void(WINAPI *pfnGetSystemTimeAsFileTime)(LPFILETIME lpSystemTimeAsFileTime);
extern pfnGetSystemTimeAsFileTime g_pfnGetSystemTimeAsFileTime;

void WINAPI InitializeGetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime)
{
pfnGetSystemTimeAsFileTime func = NULL;

#ifndef FEATURE_PAL
HMODULE hKernel32 = WszLoadLibrary(W("kernel32.dll"));
if (hKernel32 != NULL)
{
Expand Down Expand Up @@ -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));
Expand Down

0 comments on commit b1f7328

Please sign in to comment.