Merge change 23409 into donut

* changes:
  Avoid a buffer overrun in GET_NORMALIZED_STRING.
diff --git a/android/PhoneticStringUtils.cpp b/android/PhoneticStringUtils.cpp
index da5767f..cf85cb8 100644
--- a/android/PhoneticStringUtils.cpp
+++ b/android/PhoneticStringUtils.cpp
@@ -292,7 +292,7 @@
         src = STR_FOR_NULL_STR;
     }
 
-    char32_t codepoints[MAX_CODEPOINTS];
+    char32_t codepoints[MAX_CODEPOINTS]; // if array size is changed the for loop needs to be changed
 
     size_t src_len = utf8_length(src);
     if (src_len == 0) {
@@ -300,7 +300,7 @@
     }
     bool next_is_consumed;
     size_t j = 0;
-    for (size_t i = 0; i < src_len;) {
+    for (size_t i = 0; i < src_len && j < MAX_CODEPOINTS;) {
         int32_t ret = utf32_at(src, src_len, i, &i);
         if (ret < 0) {
             // failed to parse UTF-8
@@ -308,7 +308,7 @@
         }
         ret = get_codepoint_function(
                 static_cast<char32_t>(ret),
-                i + 1 < src_len ? codepoints[i + 1] : 0,
+                i + 1 < src_len ? src[i + 1] : 0,
                 &next_is_consumed);
         if (ret > 0) {
             codepoints[j] = static_cast<char32_t>(ret);
diff --git a/android/PhoneticStringUtilsTest.cpp b/android/PhoneticStringUtilsTest.cpp
index 356342e..9d06327 100644
--- a/android/PhoneticStringUtilsTest.cpp
+++ b/android/PhoneticStringUtilsTest.cpp
@@ -39,6 +39,7 @@
   void testGetUtf8FromUtf32();
   void testGetPhoneticallySortableString();
   void testGetNormalizedString();
+  void testLongString();
 
   // Note: When adding a test, do not forget to add it to DoOneTest().
 
@@ -75,6 +76,7 @@
   DoOneTest(&TestExecutor::testGetUtf8FromUtf32);
   DoOneTest(&TestExecutor::testGetPhoneticallySortableString);
   DoOneTest(&TestExecutor::testGetNormalizedString);
+  DoOneTest(&TestExecutor::testLongString);
 
   printf("Test total: %d\nSuccess: %d\nFailure: %d\n",
          m_total_count, m_success_count, m_total_count - m_success_count);
@@ -415,6 +417,15 @@
   EXPECT_EQ_UTF8_UTF8("    \t", "    \t");
 }
 
+void TestExecutor::testLongString() {
+  printf("testLongString()\n");
+  char * dst;
+  size_t len;
+  EXPECT_EQ_UTF8_UTF8("Qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqtttttttttttttttttttttttttttttttttttttttttttttttttgggggggggggggggggggggggggggggggggggggggbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+      "Qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqtttttttttttttttttttttttttttttttttttttttttttttttttggggggggggggggggggggggggggggggggggg");
+}
+
+
 int main() {
   TestExecutor executor;
   if(executor.DoAllTests()) {