From: Andy Heninger Date: Wed, 12 Apr 2017 01:19:22 +0000 (+0000) Subject: ICU-13127 Fix crashing bug in UnicodeString::toTitle() X-Git-Tag: milestone-60-0-1~91 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5dca4ba1e1ce428e8def00341caa70fc318d4f5d;p=icu ICU-13127 Fix crashing bug in UnicodeString::toTitle() X-SVN-Rev: 40036 --- diff --git a/icu4c/source/common/unistr_titlecase_brkiter.cpp b/icu4c/source/common/unistr_titlecase_brkiter.cpp index 6819049ddfe..3156fdfc575 100644 --- a/icu4c/source/common/unistr_titlecase_brkiter.cpp +++ b/icu4c/source/common/unistr_titlecase_brkiter.cpp @@ -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; diff --git a/icu4c/source/test/intltest/strcase.cpp b/icu4c/source/test/intltest/strcase.cpp index a7c07c928fa..5c291981d20 100644 --- a/icu4c/source/test/intltest/strcase.cpp +++ b/icu4c/source/test/intltest/strcase.cpp @@ -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()); +}