From 6a3bba4a2ebd6e7d4fae63f18562910e6130207d Mon Sep 17 00:00:00 2001 From: Darcy Wong Date: Tue, 27 Feb 2024 16:42:55 +0700 Subject: [PATCH 1/2] fix(android/engine): Check selection indexes --- .../keyman/engine/KMKeyboardJSHandler.java | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/android/KMEA/app/src/main/java/com/keyman/engine/KMKeyboardJSHandler.java b/android/KMEA/app/src/main/java/com/keyman/engine/KMKeyboardJSHandler.java index 4815165910..70deb91dd7 100644 --- a/android/KMEA/app/src/main/java/com/keyman/engine/KMKeyboardJSHandler.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/KMKeyboardJSHandler.java @@ -24,6 +24,7 @@ import com.keyman.engine.KMManager.KeyboardType; import com.keyman.engine.data.Keyboard; import com.keyman.engine.util.CharSequenceUtil; import com.keyman.engine.util.KMLog; +import com.keyman.engine.util.KMString; public class KMKeyboardJSHandler { private Context context; @@ -284,7 +285,17 @@ public class KMKeyboardJSHandler { // Chop dn+numPairs code points from the end of charsBackup // subSequence indices are start(inclusive) to end(exclusive) - CharSequence expectedChars = charsBackup.subSequence(0, charsBackup.length() - (dn + numPairs)); + int start = 0; + int end = charsBackup.length() - (dn + numPairs); + CharSequence expectedChars; + try { + expectedChars = charsBackup.subSequence(start, end); + } catch (IndexOutOfBoundsException e) { + KMLog.LogException(TAG, + KMString.format("Bad subSequence of start %d, end is %d, length %d, dn %d, numPairs %d", + start, end, charsBackup.length(), dn, numPairs), e); + expectedChars = charsBackup; + } ic.deleteSurroundingText(dn + numPairs, 0); CharSequence newContext = getCharacterSequence(ic, originalBufferLength - 2*dn); @@ -327,7 +338,15 @@ public class KMKeyboardJSHandler { if (Character.isLowSurrogate(sequence.charAt(0))) { // Adjust if the first char is also a split surrogate pair // subSequence indices are start(inclusive) to end(exclusive) - sequence = sequence.subSequence(1, sequence.length()); + int start = 1; + int end = sequence.length(); + try { + sequence = sequence.subSequence(start, end); + } catch (IndexOutOfBoundsException e) { + KMLog.LogException(TAG, + KMString.format("Bad subSequence of start %d, end is %d", + start, end), e); + } } return sequence; From ef2a78610e39ae7ac6ee9e56fbafa4229c15caab Mon Sep 17 00:00:00 2001 From: Darcy Wong Date: Wed, 28 Feb 2024 21:26:00 +0700 Subject: [PATCH 2/2] Update android/KMEA/app/src/main/java/com/keyman/engine/KMKeyboardJSHandler.java Co-authored-by: Joshua Horton --- .../src/main/java/com/keyman/engine/KMKeyboardJSHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/KMEA/app/src/main/java/com/keyman/engine/KMKeyboardJSHandler.java b/android/KMEA/app/src/main/java/com/keyman/engine/KMKeyboardJSHandler.java index 70deb91dd7..b85353e2e1 100644 --- a/android/KMEA/app/src/main/java/com/keyman/engine/KMKeyboardJSHandler.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/KMKeyboardJSHandler.java @@ -294,7 +294,7 @@ public class KMKeyboardJSHandler { KMLog.LogException(TAG, KMString.format("Bad subSequence of start %d, end is %d, length %d, dn %d, numPairs %d", start, end, charsBackup.length(), dn, numPairs), e); - expectedChars = charsBackup; + expectedChars = ""; } ic.deleteSurroundingText(dn + numPairs, 0); CharSequence newContext = getCharacterSequence(ic, originalBufferLength - 2*dn);