From 77ad336da790dc522216300bfb20d74b779a9d62 Mon Sep 17 00:00:00 2001 From: Don Jeba Date: Fri, 16 Nov 2018 01:01:23 +0530 Subject: [PATCH] LANG-1406 StringIndexOutOfBoundsException in StringUtils.replaceIgnoreCase --- .../java/org/apache/commons/lang3/StringUtils.java | 11 ++++++++++- .../org/apache/commons/lang3/StringUtilsTest.java | 9 +++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/lang3/StringUtils.java b/src/main/java/org/apache/commons/lang3/StringUtils.java index 12dfcdca70d..8a47ce0c56c 100644 --- a/src/main/java/org/apache/commons/lang3/StringUtils.java +++ b/src/main/java/org/apache/commons/lang3/StringUtils.java @@ -5596,7 +5596,16 @@ private static String replace(final String text, String searchString, final Stri } String searchText = text; if (ignoreCase) { - searchText = text.toLowerCase(); + StringBuilder buf = new StringBuilder(text.length()); + for (int i = 0; i < text.length(); i++) { + char c = text.charAt(i); + if (Character.UnicodeBlock.of(c) != Character.UnicodeBlock.BASIC_LATIN) { + buf.append(c); + } else { + buf.append(Character.toLowerCase(c)); + } + } + searchText = buf.toString(); searchString = searchString.toLowerCase(); } int start = 0; diff --git a/src/test/java/org/apache/commons/lang3/StringUtilsTest.java b/src/test/java/org/apache/commons/lang3/StringUtilsTest.java index afcd6b2f9f4..501e10ead38 100644 --- a/src/test/java/org/apache/commons/lang3/StringUtilsTest.java +++ b/src/test/java/org/apache/commons/lang3/StringUtilsTest.java @@ -1213,6 +1213,15 @@ public void testReplaceIgnoreCase_StringStringString() { assertEquals("farfarfar", StringUtils.replaceIgnoreCase("foofOOfoo", "OO", "ar")); } + @Test + public void testReplaceIgnoreCase_LANG_1406() { + assertEquals("\u0130", StringUtils.replaceIgnoreCase("\u0130x", "x", "")); + assertEquals("\u0130", StringUtils.replaceIgnoreCase("X\u0130x", "x", "")); + assertEquals("yz\u0130yz", StringUtils.replaceIgnoreCase("X\u0130x", "x", "yz")); + assertEquals("yzyz\u0130yz", StringUtils.replaceIgnoreCase("xX\u0130x", "x", "yz")); + assertEquals("\u0130\u0131", StringUtils.replaceIgnoreCase("\u0130x\u0131", "x", "")); + } + @Test public void testReplacePattern_StringStringString() { assertNull(StringUtils.replacePattern(null, "", ""));