Author: sebb Date: Sun Mar 26 21:43:36 2017 New Revision: 1788777 URL: http://svn.apache.org/viewvc?rev=1788777&view=rev Log: CODEC-231 StringUtils.equals(CharSequence cs1, CharSequence cs2) can fail with String Index OBE
Modified: commons/proper/codec/trunk/src/changes/changes.xml commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/binary/StringUtils.java commons/proper/codec/trunk/src/test/java/org/apache/commons/codec/binary/StringUtilsTest.java Modified: commons/proper/codec/trunk/src/changes/changes.xml URL: http://svn.apache.org/viewvc/commons/proper/codec/trunk/src/changes/changes.xml?rev=1788777&r1=1788776&r2=1788777&view=diff ============================================================================== --- commons/proper/codec/trunk/src/changes/changes.xml (original) +++ commons/proper/codec/trunk/src/changes/changes.xml Sun Mar 26 21:43:36 2017 @@ -45,6 +45,7 @@ The <action> type attribute can be add,u <release version="1.11" date="2017-MM-DD" description="Feature and fix release."> <!-- The first attribute below should be the issue id; makes it easier to navigate in the IDE outline --> + <action issue="CODEC-231" dev="sebb" type="fix">StringUtils.equals(CharSequence cs1, CharSequence cs2) can fail with String Index OBE</action> <action issue="CODEC-230" dev="sebb" type="fix">URLCodec.WWW_FORM_URL should be private</action> <action issue="CODEC-229" dev="sebb" type="fix">StringUtils.newStringxxx(null) should return null, not NPE</action> <action issue="CODEC-220" dev="sebb" type="add">Fluent interface for DigestUtils</action> Modified: commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/binary/StringUtils.java URL: http://svn.apache.org/viewvc/commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/binary/StringUtils.java?rev=1788777&r1=1788776&r2=1788777&view=diff ============================================================================== --- commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/binary/StringUtils.java (original) +++ commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/binary/StringUtils.java Sun Mar 26 21:43:36 2017 @@ -78,7 +78,7 @@ public class StringUtils { if (cs1 instanceof String && cs2 instanceof String) { return cs1.equals(cs2); } - return CharSequenceUtils.regionMatches(cs1, false, 0, cs2, 0, Math.max(cs1.length(), cs2.length())); + return cs1.length() == cs2.length() && CharSequenceUtils.regionMatches(cs1, false, 0, cs2, 0, cs1.length()); } /** Modified: commons/proper/codec/trunk/src/test/java/org/apache/commons/codec/binary/StringUtilsTest.java URL: http://svn.apache.org/viewvc/commons/proper/codec/trunk/src/test/java/org/apache/commons/codec/binary/StringUtilsTest.java?rev=1788777&r1=1788776&r2=1788777&view=diff ============================================================================== --- commons/proper/codec/trunk/src/test/java/org/apache/commons/codec/binary/StringUtilsTest.java (original) +++ commons/proper/codec/trunk/src/test/java/org/apache/commons/codec/binary/StringUtilsTest.java Sun Mar 26 21:43:36 2017 @@ -208,4 +208,33 @@ public class StringUtilsTest { final String actual = StringUtils.newStringUtf8(BYTES_FIXTURE); Assert.assertEquals(expected, actual); } + + @Test + public void testEqualsString() { + Assert.assertTrue(StringUtils.equals(null, null)); + Assert.assertFalse(StringUtils.equals("abc", null)); + Assert.assertFalse(StringUtils.equals(null, "abc")); + Assert.assertTrue(StringUtils.equals("abc", "abc")); + Assert.assertFalse(StringUtils.equals("abc", "abcd")); + Assert.assertFalse(StringUtils.equals("abcd", "abc")); + Assert.assertFalse(StringUtils.equals("abc", "ABC")); + } + + @Test + public void testEqualsCS1() { + Assert.assertFalse(StringUtils.equals(new StringBuilder("abc"), null)); + Assert.assertFalse(StringUtils.equals(null, new StringBuilder("abc"))); + Assert.assertTrue(StringUtils.equals(new StringBuilder("abc"), new StringBuilder("abc"))); + Assert.assertFalse(StringUtils.equals(new StringBuilder("abc"), new StringBuilder("abcd"))); + Assert.assertFalse(StringUtils.equals(new StringBuilder("abcd"), new StringBuilder("abc"))); + Assert.assertFalse(StringUtils.equals(new StringBuilder("abc"), new StringBuilder("ABC"))); + } + + @Test + public void testEqualsCS2() { + Assert.assertTrue(StringUtils.equals("abc", new StringBuilder("abc"))); + Assert.assertFalse(StringUtils.equals(new StringBuilder("abc"), "abcd")); + Assert.assertFalse(StringUtils.equals("abcd", new StringBuilder("abc"))); + Assert.assertFalse(StringUtils.equals(new StringBuilder("abc"), "ABC")); + } }