diff --git a/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_policy.cpp b/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_policy.cpp
index 3000860a3aeb67e7333ad6fb04d0f947961626f9..11da0395144245289f236d03cc1f8a052f574fc8 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_policy.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_policy.cpp
@@ -126,7 +126,7 @@ int DynamicPatriciaTriePolicy::getTerminalNodePositionOfWord(const int *const in
     int pos = getRootPosition();
     DynamicPatriciaTrieNodeReader nodeReader(mDictRoot, getBigramsStructurePolicy(),
             getShortcutsStructurePolicy());
-    while (currentLength <= length) {
+    while (currentLength < length) {
         // When foundMatchedNode becomes true, currentLength is increased at least once.
         bool foundMatchedNode = false;
         int totalChildCount = 0;
@@ -144,13 +144,15 @@ int DynamicPatriciaTriePolicy::getTerminalNodePositionOfWord(const int *const in
             for (int i = 0; i < childCount; i++) {
                 nodeReader.fetchNodeInfoFromBufferAndGetNodeCodePoints(pos, MAX_WORD_LENGTH,
                         mergedNodeCodePoints);
-                if (nodeReader.isDeleted() || nodeReader.getCodePointCount() <= 0) {
+                const int nodeCodePointCount = nodeReader.getCodePointCount();
+                if (nodeReader.isDeleted() || nodeCodePointCount <= 0
+                        || currentLength + nodeCodePointCount > length) {
                     // Skip deleted or empty node.
                     pos = nodeReader.getSiblingNodePos();
                     continue;
                 }
                 bool matched = true;
-                for (int j = 0; j < nodeReader.getCodePointCount(); ++j) {
+                for (int j = 0; j < nodeCodePointCount; ++j) {
                     if (mergedNodeCodePoints[j] != searchCodePoints[currentLength + j]) {
                         // Different code point is found.
                         matched = false;
@@ -158,7 +160,7 @@ int DynamicPatriciaTriePolicy::getTerminalNodePositionOfWord(const int *const in
                     }
                 }
                 if (matched) {
-                    currentLength += nodeReader.getCodePointCount();
+                    currentLength += nodeCodePointCount;
                     if (length == currentLength) {
                         // Terminal position is found.
                         return nodeReader.getNodePos();