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