From da6f0afca6caa2f87e3ba60491b380313754367c Mon Sep 17 00:00:00 2001 From: Mark Smith Date: Tue, 11 Apr 2017 21:11:27 -0700 Subject: [PATCH] Fix a few small bugs in CFLocale * Adds missing mutex unlock in an error path * Fixes use of an incorrect local variable * Addresses a few areas where _prefs member was assumed to be non-NULL * Fix to __CFLocaleGetMeasurementSystemGuts and __CFLocaleCopyTemperatureUnit modelled after __CFLocaleCopyCollatorID * Fix to __CFLocaleEqual handles the case where one or both CFLocales have NULL _prefs. --- CoreFoundation/Locale.subproj/CFLocale.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/CoreFoundation/Locale.subproj/CFLocale.c b/CoreFoundation/Locale.subproj/CFLocale.c index 7e735c48e3..5afca746d8 100644 --- a/CoreFoundation/Locale.subproj/CFLocale.c +++ b/CoreFoundation/Locale.subproj/CFLocale.c @@ -198,7 +198,11 @@ static Boolean __CFLocaleEqual(CFTypeRef cf1, CFTypeRef cf2) { if (__CFLocaleGetType(locale1) != __CFLocaleGetType(locale2)) return false; if (!CFEqual(locale1->_identifier, locale2->_identifier)) return false; if (__kCFLocaleUser == __CFLocaleGetType(locale1)) { - return CFEqual(locale1->_prefs, locale2->_prefs); + if (locale1->_prefs && locale2->_prefs) { + return CFEqual(locale1->_prefs, locale2->_prefs); + } else { + return locale1->_prefs == locale2->_prefs; + } } return true; } @@ -447,6 +451,7 @@ CFLocaleRef CFLocaleCreate(CFAllocatorRef allocator, CFStringRef identifier) { uint32_t size = sizeof(struct __CFLocale) - sizeof(CFRuntimeBase); locale = (struct __CFLocale *)_CFRuntimeCreateInstance(allocator, CFLocaleGetTypeID(), size, NULL); if (NULL == locale) { + __CFUnlock(&__CFLocaleCacheLock); if (localeIdentifier) { CFRelease(localeIdentifier); } return NULL; } @@ -1171,7 +1176,7 @@ static void __CFLocaleGetMeasurementSystemGuts(CFLocaleRef locale, bool user, UM UMeasurementSystem output = UMS_SI; // Default is Metric bool done = false; #if DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED - if (user) { + if (user && locale->_prefs) { CFTypeRef metricPref = CFDictionaryGetValue(locale->_prefs, CFSTR("AppleMetricUnits")); CFTypeRef measurementPref = CFDictionaryGetValue(locale->_prefs, CFSTR("AppleMeasurementUnits")); if (metricPref || measurementPref) { @@ -1252,7 +1257,7 @@ static bool __CFLocaleCopyTemperatureUnit(CFLocaleRef locale, bool user, CFTypeR bool celsius = true; // Default is Celsius bool done = false; #if DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED - if (user) { + if (user && locale->_prefs) { CFTypeRef temperatureUnitPref = CFDictionaryGetValue(locale->_prefs, CFSTR("AppleTemperatureUnit")); if (temperatureUnitPref) { if (CFEqual(temperatureUnitPref, kCFLocaleTemperatureUnitFahrenheit)) { @@ -1426,7 +1431,7 @@ static bool __CFLocaleFullName(const char *locale, const char *value, CFStringRe int32_t localSize; UChar localName[kMaxICUNameSize]; localSize = uloc_getDisplayLanguage(value, locale, localName, kMaxICUNameSize, &localStatus); - if (U_FAILURE(localStatus) || size <= 0 || localStatus == U_USING_DEFAULT_WARNING) + if (U_FAILURE(localStatus) || localSize <= 0 || localStatus == U_USING_DEFAULT_WARNING) return false; }