From c78d871b76c3a9908dad7f9b294a8134111308c8 Mon Sep 17 00:00:00 2001 From: AryanRG Date: Sun, 18 Oct 2026 02:46:27 +0530 Subject: [PATCH 1/2] CODEC-347 Handle names emptied during MRA cleaning Return false from isEncodeEquals when cleaning removes all characters, add public-API regression coverage, and record the issue in the changes log. --- src/changes/changes.xml | 1 + .../codec/language/MatchRatingApproachEncoder.java | 5 +++++ .../language/MatchRatingApproachEncoderTest.java | 11 +++++++++++ 3 files changed, 17 insertions(+) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 1c217375a8..af2df1526a 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -45,6 +45,7 @@ The type attribute can be add,update,fix,remove. + Avoid a StringIndexOutOfBoundsException when comparing non-identical names that become empty after cleaning in MatchRatingApproachEncoder.isEncodeEquals(String, String). Bump org.apache.commons:commons-parent from 105 to 106. diff --git a/src/main/java/org/apache/commons/codec/language/MatchRatingApproachEncoder.java b/src/main/java/org/apache/commons/codec/language/MatchRatingApproachEncoder.java index e9d9a9e147..664dacf623 100644 --- a/src/main/java/org/apache/commons/codec/language/MatchRatingApproachEncoder.java +++ b/src/main/java/org/apache/commons/codec/language/MatchRatingApproachEncoder.java @@ -236,6 +236,11 @@ public boolean isEncodeEquals(String name1, String name2) { name1 = cleanName(name1); name2 = cleanName(name2); + // Bulletproof if a name becomes empty after cleanName(name), consistent with encode(String) + if (name1.isEmpty() || name2.isEmpty()) { + return false; + } + // Actual MRA Algorithm // 1. Remove vowels diff --git a/src/test/java/org/apache/commons/codec/language/MatchRatingApproachEncoderTest.java b/src/test/java/org/apache/commons/codec/language/MatchRatingApproachEncoderTest.java index 6d14d0eb7a..d94bb3c034 100644 --- a/src/test/java/org/apache/commons/codec/language/MatchRatingApproachEncoderTest.java +++ b/src/test/java/org/apache/commons/codec/language/MatchRatingApproachEncoderTest.java @@ -381,6 +381,17 @@ final void testIsEncodeEqualsSecondNameJust1Letter_ReturnsFalse() { assertFalse(getStringEncoder().isEncodeEquals("test", "t")); } + @Test + final void testIsEncodeEquals_CornerCase_NameEmptyAfterCleaning_ReturnsFalse() { + // Names that become empty after cleanName(String), consistent with encode(String) returning "". + assertFalse(getStringEncoder().isEncodeEquals("--", "Smith")); + assertFalse(getStringEncoder().isEncodeEquals("Smith", "--")); + assertFalse(getStringEncoder().isEncodeEquals(".,-", "Smith")); + assertFalse(getStringEncoder().isEncodeEquals(" ", "Smith")); + assertFalse(getStringEncoder().isEncodeEquals("Smith", " ")); + assertFalse(getStringEncoder().isEncodeEquals("--", ".,")); + } + @Test final void testIsVowel_CapitalA_ReturnsTrue() { assertTrue(getStringEncoder().isVowel("A")); From 36f838ef96a9237ac47e5800052ca4465a630b5d Mon Sep 17 00:00:00 2001 From: Gary Gregory Date: Sun, 18 Oct 2026 09:27:24 -0400 Subject: [PATCH 2/2] Remove fix action for CODEC-347 from changes.xml Removed a fix action related to CODEC-347 from the release notes. --- src/changes/changes.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index af2df1526a..1c217375a8 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -45,7 +45,6 @@ The type attribute can be add,update,fix,remove. - Avoid a StringIndexOutOfBoundsException when comparing non-identical names that become empty after cleaning in MatchRatingApproachEncoder.isEncodeEquals(String, String). Bump org.apache.commons:commons-parent from 105 to 106.