ICU-13099 Merging the fix for #13127 UnicodeString::toTitle() crash (r40036) to maint-59.

X-SVN-Rev: 40037
This commit is contained in:
Yoshito Umaoka 2017-04-12 16:15:38 +00:00
parent 4068c39dfe
commit 3537c0b65d
2 changed files with 14 additions and 1 deletions

View file

@ -50,7 +50,11 @@ UnicodeString::toTitle(BreakIterator *titleIter, const Locale &locale, uint32_t
return *this;
}
}
bi->setText(*this);
// Because the "this" string is both the source and the destination,
// make a copy of the original source for use by the break iterator.
// See tickets #13127 and #13128
UnicodeString copyOfInput(*this);
bi->setText(copyOfInput);
caseMap(ustrcase_getCaseLocale(locale.getBaseName()), options, bi, ustrcase_internalToTitle);
if(titleIter==NULL) {
delete bi;

View file

@ -61,6 +61,7 @@ public:
void TestCaseMapWithEdits();
void TestCaseMapUTF8WithEdits();
void TestLongUnicodeString();
void TestBug13127();
private:
void assertGreekUpper(const char16_t *s, const char16_t *expected);
@ -89,6 +90,7 @@ StringCaseTest::runIndexedTest(int32_t index, UBool exec, const char *&name, cha
TESTCASE_AUTO(TestCaseConversion);
#if !UCONFIG_NO_BREAK_ITERATION && !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION
TESTCASE_AUTO(TestCasing);
TESTCASE_AUTO(TestBug13127);
#endif
TESTCASE_AUTO(TestFullCaseFoldingIterator);
TESTCASE_AUTO(TestGreekUpper);
@ -1138,3 +1140,10 @@ void StringCaseTest::TestLongUnicodeString() {
s.toUpper(Locale::getRoot());
assertEquals("string length 306", expected, s);
}
void StringCaseTest::TestBug13127() {
// Test case crashed when the bug was present.
const char16_t *s16 = u"日本語";
UnicodeString s(TRUE, s16, -1);
s.toTitle(0, Locale::getEnglish());
}