Skip to content

Commit d076a28

Browse files
committed
CoreFoundation: fix a rare, possible race on Windows
It is in theory possible to hit a race condition with the CFTimeZone PLIST loading as there was a small window where the object was accessed unsynchronised. Although unlikely, protect against it anyways. Thread A | Thread B CFTimeZoneCopyWinToOlsonDictionary() | Lock | __CFTimeZoneWinToOlsonDict != NULL | Unlock | | CFTimeZoneSetWinToOlsonDictionary() | Lock | retain new dictionary | release old dictionary retains "old" (invalid) dictionary | | swap | Unlock
1 parent 3cd1f79 commit d076a28

File tree

1 file changed

+4
-4
lines changed

1 file changed

+4
-4
lines changed

CoreFoundation/NumberDate.subproj/CFTimeZone.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -551,9 +551,9 @@ CFDictionaryRef CFTimeZoneCopyWinToOlsonDictionary(void) {
551551
if (NULL == __CFTimeZoneWinToOlsonDict) {
552552
__CFTimeZoneWinToOlsonDict = CFDictionaryCreate(kCFAllocatorSystemDefault, NULL, NULL, 0, NULL, NULL);
553553
}
554+
dict = __CFTimeZoneWinToOlsonDict ? (CFDictionaryRef)CFRetain(__CFTimeZoneWinToOlsonDict) : NULL;
554555
__CFTimeZoneUnlockWinToOlson();
555556

556-
dict = __CFTimeZoneWinToOlsonDict ? (CFDictionaryRef)CFRetain(__CFTimeZoneWinToOlsonDict) : NULL;
557557
return dict;
558558
}
559559

@@ -581,9 +581,9 @@ void CFTimeZoneSetWinToOlsonDictionary(CFDictionaryRef dict) {
581581
__CFGenericValidateType(dict, CFDictionaryGetTypeID());
582582
__CFTimeZoneLockWinToOlson();
583583
if (dict != __CFTimeZoneWinToOlsonDict) {
584-
if (dict) CFRetain(dict);
585-
if (__CFTimeZoneWinToOlsonDict) CFRelease(__CFTimeZoneWinToOlsonDict);
586-
__CFTimeZoneWinToOlsonDict = dict;
584+
CFDictionaryRef oldDict = __CFTimeZoneWinToOlsonDict;
585+
__CFTimeZoneWinToOlsonDict = dict ? CFRetain(dict) : NULL;
586+
CFRelease(oldDict);
587587
}
588588
__CFTimeZoneUnlockWinToOlson();
589589
}

0 commit comments

Comments
 (0)