From bb3871741b9a2988937c9ae0600a305c1680cf5e Mon Sep 17 00:00:00 2001 From: Mark Nauwelaerts Date: Thu, 31 Jul 2025 19:03:30 +0200 Subject: [PATCH] [winpr,timezone] ensure thread-safe initialization --- winpr/libwinpr/timezone/TimeZoneIanaAbbrevMap.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/winpr/libwinpr/timezone/TimeZoneIanaAbbrevMap.c b/winpr/libwinpr/timezone/TimeZoneIanaAbbrevMap.c index 3346c3ad0..99d4d9230 100644 --- a/winpr/libwinpr/timezone/TimeZoneIanaAbbrevMap.c +++ b/winpr/libwinpr/timezone/TimeZoneIanaAbbrevMap.c @@ -27,6 +27,7 @@ #include #include +#include #include "timezone.h" typedef struct @@ -229,20 +230,21 @@ static void TimeZoneIanaAbbrevCleanup(void) TimeZoneIanaAbbrevMapSize = 0; } -static void TimeZoneIanaAbbrevInitialize(void) +static BOOL CALLBACK TimeZoneIanaAbbrevInitialize(WINPR_ATTR_UNUSED PINIT_ONCE once, + WINPR_ATTR_UNUSED PVOID param, + WINPR_ATTR_UNUSED PVOID* context) { - static BOOL initialized = FALSE; - if (initialized) - return; - iterate_subdir_recursive(zonepath, NULL, NULL); (void)atexit(TimeZoneIanaAbbrevCleanup); - initialized = TRUE; + + return TRUE; } size_t TimeZoneIanaAbbrevGet(const char* abbrev, const char** list, size_t listsize) { - TimeZoneIanaAbbrevInitialize(); + static INIT_ONCE init_guard = INIT_ONCE_STATIC_INIT; + + InitOnceExecuteOnce(&init_guard, TimeZoneIanaAbbrevInitialize, NULL, NULL); size_t rc = 0; for (size_t x = 0; x < TimeZoneIanaAbbrevMapSize; x++)