From: Travis Keep Date: Tue, 9 Dec 2014 23:08:31 +0000 (+0000) Subject: ICU-10638 Fix collator:;getKeywordsXXX functions so that they never leak memory. X-Git-Tag: milestone-59-0-1~1393 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d0c5712ce4b46bb65cdb4cfb20e817a2a86df019;p=icu ICU-10638 Fix collator:;getKeywordsXXX functions so that they never leak memory. X-SVN-Rev: 36834 --- diff --git a/icu4c/source/i18n/coll.cpp b/icu4c/source/i18n/coll.cpp index c4845f2b1f9..21b59f7395f 100644 --- a/icu4c/source/i18n/coll.cpp +++ b/icu4c/source/i18n/coll.cpp @@ -867,39 +867,39 @@ Collator::getAvailableLocales(void) return NULL; } -StringEnumeration* U_EXPORT2 -Collator::getKeywords(UErrorCode& status) { - // This is a wrapper over ucol_getKeywords - UEnumeration* uenum = ucol_getKeywords(&status); +static StringEnumeration * +newUStringEnumeration(UEnumeration *uenumToAdopt, UErrorCode &status) { if (U_FAILURE(status)) { - uenum_close(uenum); + uenum_close(uenumToAdopt); + return NULL; + } + StringEnumeration *result = new UStringEnumeration(uenumToAdopt); + if (result == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + uenum_close(uenumToAdopt); return NULL; } - return new UStringEnumeration(uenum); + return result; +} + +StringEnumeration* U_EXPORT2 +Collator::getKeywords(UErrorCode& status) { + return newUStringEnumeration(ucol_getKeywords(&status), status); } StringEnumeration* U_EXPORT2 Collator::getKeywordValues(const char *keyword, UErrorCode& status) { - // This is a wrapper over ucol_getKeywordValues - UEnumeration* uenum = ucol_getKeywordValues(keyword, &status); - if (U_FAILURE(status)) { - uenum_close(uenum); - return NULL; - } - return new UStringEnumeration(uenum); + return newUStringEnumeration( + ucol_getKeywordValues(keyword, &status), status); } StringEnumeration* U_EXPORT2 Collator::getKeywordValuesForLocale(const char* key, const Locale& locale, UBool commonlyUsed, UErrorCode& status) { - // This is a wrapper over ucol_getKeywordValuesForLocale - UEnumeration *uenum = ucol_getKeywordValuesForLocale(key, locale.getName(), - commonlyUsed, &status); - if (U_FAILURE(status)) { - uenum_close(uenum); - return NULL; - } - return new UStringEnumeration(uenum); + return newUStringEnumeration( + ucol_getKeywordValuesForLocale( + key, locale.getName(), commonlyUsed, &status), + status); } Locale U_EXPORT2