From 92ef7be3cb7133f00bcd39413e08444897208992 Mon Sep 17 00:00:00 2001 From: Georg Friedrich Date: Thu, 12 Oct 2017 13:13:55 +0200 Subject: [PATCH 1/3] [LOG4J2-1216] fix PatternParser for patterns without closing brackets --- .../log4j/core/pattern/PatternParser.java | 6 ++++- .../log4j/core/pattern/PatternParserTest.java | 25 ++++++++++++------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java index 5260b11459b..4c7c4139dbd 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java @@ -287,7 +287,11 @@ private static int extractOptions(final String pattern, final int start, final L } // while if (depth > 0) { // option not closed, continue with pattern after closing bracket - return pattern.indexOf('}', start) + 1; + i = pattern.lastIndexOf('}'); + if (i == -1 || i < start) { + return start + 1; + } + return i + 1; } options.add(pattern.substring(begin, i - 1)); diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest.java index 1b68c0da621..da93afe896b 100644 --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest.java +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest.java @@ -161,7 +161,6 @@ public void testPatternTruncateFromEnd() { assertTrue("Expected to end with: " + expected + ". Actual: " + str, str.endsWith(expected)); } - @Test public void testBadPattern() { final Calendar cal = Calendar.getInstance(); @@ -230,18 +229,12 @@ private void testNestedPatternHighlight(final Level level, final String expected @Test public void testNanoPatternShort() { - final List formatters = parser.parse("%N"); - assertNotNull(formatters); - assertEquals(1, formatters.size()); - assertTrue(formatters.get(0).getConverter() instanceof NanoTimePatternConverter); + testFirstConverter("%N", NanoTimePatternConverter.class); } @Test public void testNanoPatternLong() { - final List formatters = parser.parse("%nano"); - assertNotNull(formatters); - assertEquals(1, formatters.size()); - assertTrue(formatters.get(0).getConverter() instanceof NanoTimePatternConverter); + testFirstConverter("%nano", NanoTimePatternConverter.class); } @Test @@ -348,6 +341,20 @@ public void testDeeplyNestedPattern() { formatters.get(0).format(event, buf); final String expected = " 123 "; assertEquals(expected, buf.toString()); + } + + @Test + public void testMissingClosingBracket() { + testFirstConverter("%d{", DatePatternConverter.class); + } + + @Test + public void testClosingBracketButWrongPlace() { + final List formatters = parser.parse("}%d{"); + assertNotNull(formatters); + assertEquals(2, formatters.size()); + validateConverter(formatters, 0, "Literal"); + validateConverter(formatters, 1, "Date"); } } From 8b04da5ca1988c860b25a3a01cb9863ac6b3ae99 Mon Sep 17 00:00:00 2001 From: Georg Friedrich Date: Thu, 12 Oct 2017 13:51:57 +0200 Subject: [PATCH 2/3] [LOG4J2-1216] add some documentation --- .../org/apache/logging/log4j/core/pattern/PatternParser.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java index 4c7c4139dbd..93901248009 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java @@ -289,7 +289,9 @@ private static int extractOptions(final String pattern, final int start, final L if (depth > 0) { // option not closed, continue with pattern after closing bracket i = pattern.lastIndexOf('}'); if (i == -1 || i < start) { - return start + 1; + // if no closing bracket could be found or there is no closing bracket + // after the the start of our parsing process + return begin; } return i + 1; } From dc4ff09a41eb207f4bbc4ea86f66aec92b562b01 Mon Sep 17 00:00:00 2001 From: Georg Friedrich Date: Thu, 12 Oct 2017 13:56:07 +0200 Subject: [PATCH 3/3] [LOG4J2-1216] add some documentation --- .../org/apache/logging/log4j/core/pattern/PatternParser.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java index 93901248009..91c11ecb498 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java @@ -289,8 +289,8 @@ private static int extractOptions(final String pattern, final int start, final L if (depth > 0) { // option not closed, continue with pattern after closing bracket i = pattern.lastIndexOf('}'); if (i == -1 || i < start) { - // if no closing bracket could be found or there is no closing bracket - // after the the start of our parsing process + // if no closing bracket could be found or there is no closing bracket behind the starting + // character of our parsing process continue parsing after the first opening bracket return begin; } return i + 1;