diff --git a/src/main/java/org/apache/maven/shared/filtering/MultiDelimiterInterpolatorFilterReaderLineEnding.java b/src/main/java/org/apache/maven/shared/filtering/MultiDelimiterInterpolatorFilterReaderLineEnding.java index 40213307..37b84e27 100644 --- a/src/main/java/org/apache/maven/shared/filtering/MultiDelimiterInterpolatorFilterReaderLineEnding.java +++ b/src/main/java/org/apache/maven/shared/filtering/MultiDelimiterInterpolatorFilterReaderLineEnding.java @@ -220,7 +220,7 @@ public int read() throws IOException { for (int i = 0; i < getEscapeString().length(); i++) { key.append((char) ch); - if (ch != getEscapeString().charAt(i) || ch == '\n' && !supportMultiLineFiltering) { + if (ch != getEscapeString().charAt(i) || ch == -1 || ch == '\n' && !supportMultiLineFiltering) { // mismatch, EOF or EOL, no escape string here in.reset(); inEscape = false; @@ -243,7 +243,7 @@ public int read() throws IOException { } for (int i = 0; i < begin.length(); i++) { - if (ch != begin.charAt(i) || ch == '\n' && !supportMultiLineFiltering) { + if (ch != begin.charAt(i) || ch == -1 || ch == '\n' && !supportMultiLineFiltering) { // mismatch, EOF or EOL, no match break; } @@ -274,7 +274,9 @@ public int read() throws IOException { beginToken = null; endToken = null; - key.append((char) ch); + if (ch >= 0) { + key.append((char) ch); + } replaceData = key.toString(); replaceIndex = key.length(); diff --git a/src/test/java/org/apache/maven/shared/filtering/MultiDelimiterInterpolatorFilterReaderLineEndingTest.java b/src/test/java/org/apache/maven/shared/filtering/MultiDelimiterInterpolatorFilterReaderLineEndingTest.java index d8891602..2f9af31f 100644 --- a/src/test/java/org/apache/maven/shared/filtering/MultiDelimiterInterpolatorFilterReaderLineEndingTest.java +++ b/src/test/java/org/apache/maven/shared/filtering/MultiDelimiterInterpolatorFilterReaderLineEndingTest.java @@ -108,4 +108,15 @@ void atDollarExpression() throws Exception { assertEquals(" url=\"jdbc:oracle:thin:@DB_SERVER:DB_PORT:DB_NAME\"", IOUtils.toString(reader)); } + + @Test + void eofAfterEscapeCharDoesNotProduceGarbage() throws Exception { + Reader in = new StringReader("\\"); + MultiDelimiterInterpolatorFilterReaderLineEnding reader = + new MultiDelimiterInterpolatorFilterReaderLineEnding(in, interpolator, true); + reader.setDelimiterSpecs(Collections.singleton("@")); + reader.setEscapeString("\\"); + + assertEquals("\\", IOUtils.toString(reader)); + } }