Commit 14e0a526 authored by Parastoo Geranmayeh's avatar Parastoo Geranmayeh Committed by Commit Bot

[AF] crash fix for collator creation.

icu::Collator::createInstance may not work properly for some locals.

Bug: 958643
Change-Id: I9923b4dfe84de84bf670b0c415671c1ea5b2af6d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1592677Reviewed-by: default avatarMathieu Perreault <mathp@chromium.org>
Commit-Queue: Parastoo Geranmayeh <parastoog@google.com>
Cr-Commit-Position: refs/heads/master@{#655996}
parent 20237aab
...@@ -228,7 +228,24 @@ InputSuggester::StringCanonicalizer::StringCanonicalizer() ...@@ -228,7 +228,24 @@ InputSuggester::StringCanonicalizer::StringCanonicalizer()
UErrorCode error_code = U_ZERO_ERROR; UErrorCode error_code = U_ZERO_ERROR;
collator_.reset( collator_.reset(
icu::Collator::createInstance(icu::Locale::getRoot(), error_code)); icu::Collator::createInstance(icu::Locale::getRoot(), error_code));
if (!collator_ || !U_SUCCESS(error_code)) {
// On some systems, the default locale is invalid to the eyes of the ICU
// library. This could be due to a device-specific issue (has been seen in
// the wild on Android and iOS devices). In the failure case, |collator_|
// will be null. See http://crbug.com/558625.
// Attempt to load the English locale.
error_code = U_ZERO_ERROR;
collator_.reset(
icu::Collator::createInstance(icu::Locale::getEnglish(), error_code));
if (!collator_) {
LOG(ERROR) << "Failed to initialize the ICU Collator with the English "
<< "locale.";
}
}
DCHECK(U_SUCCESS(error_code)); DCHECK(U_SUCCESS(error_code));
if (collator_ && U_SUCCESS(error_code))
collator_->setStrength(icu::Collator::PRIMARY); collator_->setStrength(icu::Collator::PRIMARY);
} }
...@@ -240,7 +257,8 @@ const std::vector<uint8_t>& InputSuggester::StringCanonicalizer::Canonicalize( ...@@ -240,7 +257,8 @@ const std::vector<uint8_t>& InputSuggester::StringCanonicalizer::Canonicalize(
icu::UnicodeString icu_str(original.c_str(), icu::UnicodeString icu_str(original.c_str(),
static_cast<int32_t>(original.length())); static_cast<int32_t>(original.length()));
int32_t sort_key_size = int32_t sort_key_size = 0;
if (collator_)
collator_->getSortKey(icu_str, &buffer_[0], buffer_size()); collator_->getSortKey(icu_str, &buffer_[0], buffer_size());
DCHECK_LT(0, sort_key_size); DCHECK_LT(0, sort_key_size);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment