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
+ }
}
}