blob: 2f753c36c66ad7b23b0d49c09fda3cd167c194a5 [file] [log] [blame]
diff --git a/source/common/locdispnames.cpp b/source/common/locdispnames.cpp
index 1aa3ca70..a80ba67c 100644
--- a/source/common/locdispnames.cpp
+++ b/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/source/common/locdspnm.cpp b/source/common/locdspnm.cpp
index 39934dc6..6af5f2a8 100644
--- a/source/common/locdspnm.cpp
+++ b/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/source/common/ucurr.cpp b/source/common/ucurr.cpp
index f2cae13c..40e69588 100644
--- a/source/common/ucurr.cpp
+++ b/source/common/ucurr.cpp
@@ -2221,6 +2221,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/source/i18n/numsys.cpp b/source/i18n/numsys.cpp
index a05c7e09..253a68eb 100644
--- a/source/i18n/numsys.cpp
+++ b/source/i18n/numsys.cpp
@@ -25,6 +25,7 @@
#include "unicode/schriter.h"
#include "unicode/numsys.h"
#include "cstring.h"
+#include "uassert.h"
#include "uresimp.h"
#include "numsys_impl.h"
@@ -115,7 +116,12 @@ NumberingSystem::createInstance(const Locale & inLocale, UErrorCode& status) {
UBool usingFallback = FALSE;
char buffer[ULOC_KEYWORDS_CAPACITY];
int32_t count = inLocale.getKeywordValue("numbers",buffer, sizeof(buffer),status);
+ if (U_FAILURE(status) || status == U_STRING_NOT_TERMINATED_WARNING) {
+ count = 0;
+ status = U_ZERO_ERROR;
+ }
if ( count > 0 ) { // @numbers keyword was specified in the locale
+ U_ASSERT(count < ULOC_KEYWORDS_CAPACITY);
buffer[count] = '\0'; // Make sure it is null terminated.
if ( !uprv_strcmp(buffer,gDefault) || !uprv_strcmp(buffer,gNative) ||
!uprv_strcmp(buffer,gTraditional) || !uprv_strcmp(buffer,gFinance)) {
diff --git a/source/i18n/ucol_sit.cpp b/source/i18n/ucol_sit.cpp
index ad064f2a..f0e5bdae 100644
--- a/source/i18n/ucol_sit.cpp
+++ b/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 >= 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;