This is an automated email from the ASF dual-hosted git repository.

garydgregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-lang.git


The following commit(s) were added to refs/heads/master by this push:
     new 5b87be5e6 fix indexOfAny matching an unpaired trailing high surrogate 
(#1687)
5b87be5e6 is described below

commit 5b87be5e67f393cf62a11dbc8ffcbec56cdde12b
Author: alhuda <[email protected]>
AuthorDate: Sat Jun 6 21:42:32 2026 +0530

    fix indexOfAny matching an unpaired trailing high surrogate (#1687)
    
    Co-authored-by: alhudz <[email protected]>
---
 src/main/java/org/apache/commons/lang3/StringUtils.java               | 3 +--
 .../java/org/apache/commons/lang3/StringUtilsEqualsIndexOfTest.java   | 4 ++++
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/src/main/java/org/apache/commons/lang3/StringUtils.java 
b/src/main/java/org/apache/commons/lang3/StringUtils.java
index 597345f50..79e130683 100644
--- a/src/main/java/org/apache/commons/lang3/StringUtils.java
+++ b/src/main/java/org/apache/commons/lang3/StringUtils.java
@@ -2815,8 +2815,7 @@ public static int indexOfAny(final CharSequence cs, final 
int csStart, final cha
             final char ch = cs.charAt(i);
             for (int j = 0; j < searchLen; j++) {
                 if (searchChars[j] == ch) {
-                    // ch is a supplementary character
-                    if (i >= csLast || j >= searchLast || 
!Character.isHighSurrogate(ch) || searchChars[j + 1] == cs.charAt(i + 1)) {
+                    if (!Character.isHighSurrogate(ch) || j == searchLast || i 
< csLast && searchChars[j + 1] == cs.charAt(i + 1)) {
                         return i;
                     }
                 }
diff --git 
a/src/test/java/org/apache/commons/lang3/StringUtilsEqualsIndexOfTest.java 
b/src/test/java/org/apache/commons/lang3/StringUtilsEqualsIndexOfTest.java
index 4c0d827c8..2be5fb722 100644
--- a/src/test/java/org/apache/commons/lang3/StringUtilsEqualsIndexOfTest.java
+++ b/src/test/java/org/apache/commons/lang3/StringUtilsEqualsIndexOfTest.java
@@ -411,6 +411,10 @@ void 
testIndexOfAny_StringCharArrayWithSupplementaryChars() {
         assertEquals(2, StringUtils.indexOfAny(CharU20000 + CharU20001, 
CharU20001.toCharArray()));
         assertEquals(0, StringUtils.indexOfAny(CharU20000, 
CharU20000.toCharArray()));
         assertEquals(-1, StringUtils.indexOfAny(CharU20000, 
CharU20001.toCharArray()));
+        // An unpaired trailing high surrogate must not match a supplementary 
code point, matching containsAny.
+        assertEquals(-1, StringUtils.indexOfAny(CharUSuppCharHigh, 
CharU20001.toCharArray()));
+        assertFalse(StringUtils.containsAny(CharUSuppCharHigh, 
CharU20001.toCharArray()));
+        assertEquals(-1, StringUtils.indexOfAny("abc" + CharUSuppCharHigh, 
CharU20000.toCharArray()));
     }
 
     @Test

Reply via email to