Applying github pull request https://github.com/apache/commons-lang/pull/5, linked as LANG-928, fixing a bug in OctalEscaper trying to parse octal numbers longer than 3 digits
git-svn-id: https://svn.apache.org/repos/asf/commons/proper/lang/trunk@1535911 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 88a592b..fbe1935 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -22,6 +22,7 @@
<body>
<release version="3.2" date="TBA" description="Next release">
+ <action issue="LANG-928" type="fix">OctalUnescaper has bugs when parsing octals starting with a zero</action>
<action issue="LANG-905" type="fix">EqualsBuilder returns true when comparing arrays, even when the elements are different</action>
<action issue="LANG-774" type="add" due-to="Erhan Bagdemir">Added isStarted, isSuspended and isStopped to StopWatch</action>
<action issue="LANG-917" type="fix" due-to="Arne Burmeister">Fixed exception when combining custom and choice format in ExtendedMessageFormat</action>
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 52b40c4..1d6a02c 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 @@
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 7cbe60c..0485a17 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 @@
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
+ }
}
}