diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 88a592bf8..fbe193585 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -22,6 +22,7 @@ + OctalUnescaper has bugs when parsing octals starting with a zero EqualsBuilder returns true when comparing arrays, even when the elements are different Added isStarted, isSuspended and isStopped to StopWatch Fixed exception when combining custom and choice format in ExtendedMessageFormat diff --git a/src/main/java/org/apache/commons/lang3/text/translate/OctalUnescaper.java b/src/main/java/org/apache/commons/lang3/text/translate/OctalUnescaper.java index 52b40c432..1d6a02c02 100644 --- a/src/main/java/org/apache/commons/lang3/text/translate/OctalUnescaper.java +++ b/src/main/java/org/apache/commons/lang3/text/translate/OctalUnescaper.java @@ -50,6 +50,10 @@ public int translate(final CharSequence input, final int index, final Writer out end--; // rollback break; } + // only 3 characters applicable for Octal + if (end - start >= 3) { + break; + } } out.write( Integer.parseInt(input.subSequence(start, end).toString(), 8) ); diff --git a/src/test/java/org/apache/commons/lang3/text/translate/OctalUnescaperTest.java b/src/test/java/org/apache/commons/lang3/text/translate/OctalUnescaperTest.java index 7cbe60ce3..0485a17c1 100644 --- a/src/test/java/org/apache/commons/lang3/text/translate/OctalUnescaperTest.java +++ b/src/test/java/org/apache/commons/lang3/text/translate/OctalUnescaperTest.java @@ -44,15 +44,44 @@ public void testBetween() { input = "\\378 and"; result = oue.translate(input); - assertEquals("Failed to unescape octal characters via the between method", "\378 and", result); + assertEquals("Failed to unescape octal characters via the between method", "\37" + "8 and", result); input = "\\378"; result = oue.translate(input); - assertEquals("Failed to unescape octal characters via the between method", "\378", result); + assertEquals("Failed to unescape octal characters via the between method", "\37" + "8", result); input = "\\1"; result = oue.translate(input); assertEquals("Failed to unescape octal characters via the between method", "\1", result); + + input = "\\036"; + result = oue.translate(input); + assertEquals("Failed to unescape octal characters via the between method", "\036", result); + + input = "\\0365"; + result = oue.translate(input); + assertEquals("Failed to unescape octal characters via the between method", "\036" + "5", result); + + input = "\\003"; + result = oue.translate(input); + assertEquals("Failed to unescape octal characters via the between method", "\003", result); + + input = "\\0003"; + result = oue.translate(input); + assertEquals("Failed to unescape octal characters via the between method", "\000" + "3", result); + } + + @Test + public void testOutOfRange() { + final OctalUnescaper oue = new OctalUnescaper(); + + String input = "\\999"; + try { + String result = oue.translate(input); + fail("NumberFormatException was expected for input: " + input); + } catch(NumberFormatException nfe) { + // expected + } } }