Fix native crash in BigramDictionary::addWordBigram()

Bug: 12479653
Change-Id: I7d263f744f711202000524a47769dc2d3d0e0de6
diff --git a/native/jni/src/suggest/core/dictionary/bigram_dictionary.cpp b/native/jni/src/suggest/core/dictionary/bigram_dictionary.cpp
index 2a62b55..d0b96b0 100644
--- a/native/jni/src/suggest/core/dictionary/bigram_dictionary.cpp
+++ b/native/jni/src/suggest/core/dictionary/bigram_dictionary.cpp
@@ -41,6 +41,9 @@
 
 void BigramDictionary::addWordBigram(int *word, int length, int probability, int *bigramProbability,
         int *bigramCodePoints, int *outputTypes) const {
+    if (length >= MAX_WORD_LENGTH) {
+        length = MAX_WORD_LENGTH - 1;
+    }
     word[length] = 0;
     if (DEBUG_DICT_FULL) {
 #ifdef FLAG_DBG
@@ -66,14 +69,17 @@
     if (insertAt >= MAX_RESULTS) {
         return;
     }
-    memmove(bigramProbability + (insertAt + 1),
-            bigramProbability + insertAt,
+    // Shift result buffers to insert the new entry.
+    memmove(bigramProbability + (insertAt + 1), bigramProbability + insertAt,
             (MAX_RESULTS - insertAt - 1) * sizeof(bigramProbability[0]));
-    bigramProbability[insertAt] = probability;
-    outputTypes[insertAt] = Dictionary::KIND_PREDICTION;
+    memmove(outputTypes + (insertAt + 1), outputTypes + insertAt,
+            (MAX_RESULTS - insertAt - 1) * sizeof(outputTypes[0]));
     memmove(bigramCodePoints + (insertAt + 1) * MAX_WORD_LENGTH,
             bigramCodePoints + insertAt * MAX_WORD_LENGTH,
             (MAX_RESULTS - insertAt - 1) * sizeof(bigramCodePoints[0]) * MAX_WORD_LENGTH);
+    // Put the result.
+    bigramProbability[insertAt] = probability;
+    outputTypes[insertAt] = Dictionary::KIND_PREDICTION;
     int *dest = bigramCodePoints + insertAt * MAX_WORD_LENGTH;
     while (length--) {
         *dest++ = *word++;