From 1c794eb111bb9c146375038dd66806aaa26f35ce Mon Sep 17 00:00:00 2001 From: Andy Heninger Date: Wed, 11 Oct 2017 22:22:45 +0000 Subject: [PATCH] ICU-13394 nul-terminated buffer handling fixed from Chromium. X-SVN-Rev: 40615 --- icu4c/source/common/locdispnames.cpp | 2 ++ icu4c/source/common/locdspnm.cpp | 3 ++- icu4c/source/common/ucurr.cpp | 1 + icu4c/source/i18n/ucol_sit.cpp | 11 +++++++++-- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/icu4c/source/common/locdispnames.cpp b/icu4c/source/common/locdispnames.cpp index 95750e44006..e38550274f9 100644 --- a/icu4c/source/common/locdispnames.cpp +++ b/icu4c/source/common/locdispnames.cpp @@ -821,6 +821,8 @@ uloc_getDisplayKeywordValue( const char* locale, /* get the keyword value */ keywordValue[0]=0; keywordValueLen = uloc_getKeywordValue(locale, keyword, keywordValue, capacity, status); + if (*status == U_STRING_NOT_TERMINATED_WARNING) + *status = U_BUFFER_OVERFLOW_ERROR; /* * if the keyword is equal to currency .. then to get the display name diff --git a/icu4c/source/common/locdspnm.cpp b/icu4c/source/common/locdspnm.cpp index b034a278a42..6ceb6cfc8bc 100644 --- a/icu4c/source/common/locdspnm.cpp +++ b/icu4c/source/common/locdspnm.cpp @@ -636,8 +636,9 @@ LocaleDisplayNamesImpl::localeDisplayName(const Locale& locale, char value[ULOC_KEYWORD_AND_VALUES_CAPACITY]; // sigh, no ULOC_VALUE_CAPACITY const char* key; while ((key = e->next((int32_t *)0, status)) != NULL) { + value[0] = 0; locale.getKeywordValue(key, value, ULOC_KEYWORD_AND_VALUES_CAPACITY, status); - if (U_FAILURE(status)) { + if (U_FAILURE(status) || status == U_STRING_NOT_TERMINATED_WARNING) { return result; } keyDisplayName(key, temp, TRUE); diff --git a/icu4c/source/common/ucurr.cpp b/icu4c/source/common/ucurr.cpp index b7b00cbcebf..a772da9a299 100644 --- a/icu4c/source/common/ucurr.cpp +++ b/icu4c/source/common/ucurr.cpp @@ -2230,6 +2230,7 @@ ucurr_countCurrencies(const char* locale, UErrorCode localStatus = U_ZERO_ERROR; char id[ULOC_FULLNAME_CAPACITY]; uloc_getKeywordValue(locale, "currency", id, ULOC_FULLNAME_CAPACITY, &localStatus); + // get country or country_variant in `id' /*uint32_t variantType =*/ idForLocale(locale, id, sizeof(id), ec); diff --git a/icu4c/source/i18n/ucol_sit.cpp b/icu4c/source/i18n/ucol_sit.cpp index ad064f2ae42..43c1f5d6732 100644 --- a/icu4c/source/i18n/ucol_sit.cpp +++ b/icu4c/source/i18n/ucol_sit.cpp @@ -465,8 +465,15 @@ ucol_prepareShortStringOpen( const char *definition, UResourceBundle *collElem = NULL; char keyBuffer[256]; // if there is a keyword, we pick it up and try to get elements - if(!uloc_getKeywordValue(buffer, "collation", keyBuffer, 256, status)) { - // no keyword. we try to find the default setting, which will give us the keyword value + int32_t keyLen = uloc_getKeywordValue(buffer, "collation", keyBuffer, sizeof(keyBuffer), status); + // Treat too long a value as no keyword. + if(keyLen >= (int32_t)sizeof(keyBuffer)) { + keyLen = 0; + *status = U_ZERO_ERROR; + } + if(keyLen == 0) { + // no keyword + // we try to find the default setting, which will give us the keyword value UResourceBundle *defaultColl = ures_getByKeyWithFallback(collations, "default", NULL, status); if(U_SUCCESS(*status)) { int32_t defaultKeyLen = 0;