Repository: logging-log4j2 Updated Branches: refs/heads/master 9d4911bad -> 8bd80f346
LOG4J2-1542 Prevent ArrayIndexOutOfBoundsException in ParameterizedMessage.formatTo for single-char or empty messages. Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/8bd80f34 Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/8bd80f34 Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/8bd80f34 Branch: refs/heads/master Commit: 8bd80f34668af8120757b4f8eda6abc24de26a2d Parents: 9d4911b Author: rpopma <rpo...@apache.org> Authored: Tue Sep 6 02:40:57 2016 +0900 Committer: rpopma <rpo...@apache.org> Committed: Tue Sep 6 02:40:57 2016 +0900 ---------------------------------------------------------------------- .../log4j/message/ParameterizedMessage.java | 13 ++++++----- .../log4j/message/ParameterizedMessageTest.java | 24 ++++++++++++++++++++ src/changes/changes.xml | 3 +++ 3 files changed, 34 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/8bd80f34/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java index 0994d00..6936a53 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java @@ -29,10 +29,10 @@ import org.apache.logging.log4j.util.StringBuilderFormattable; * </p> */ public class ParameterizedMessage implements Message, StringBuilderFormattable { - + // Should this be configurable? private static final int DEFAULT_STRING_BUILDER_SIZE = 255; - + /** * Prefix for recursion. */ @@ -46,17 +46,17 @@ public class ParameterizedMessage implements Message, StringBuilderFormattable { * Prefix for errors. */ public static final String ERROR_PREFIX = ParameterFormatter.ERROR_PREFIX; - + /** * Separator for errors. */ public static final String ERROR_SEPARATOR = ParameterFormatter.ERROR_SEPARATOR; - + /** * Separator for error messages. */ public static final String ERROR_MSG_SEPARATOR = ParameterFormatter.ERROR_MSG_SEPARATOR; - + /** * Suffix for errors. */ @@ -142,7 +142,8 @@ public class ParameterizedMessage implements Message, StringBuilderFormattable { private void init(final String messagePattern) { this.messagePattern = messagePattern; - this.indices = new int[messagePattern == null ? 0 : messagePattern.length() >> 1]; // divide by 2 + final int len = Math.max(1, messagePattern == null ? 0 : messagePattern.length() >> 1); // divide by 2 + this.indices = new int[len]; // LOG4J2-1542 ensure non-zero array length final int placeholders = ParameterFormatter.countArgumentPlaceholders2(messagePattern, indices); initThrowable(argArray, placeholders); this.usedCount = Math.min(placeholders, argArray == null ? 0 : argArray.length); http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/8bd80f34/log4j-api/src/test/java/org/apache/logging/log4j/message/ParameterizedMessageTest.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/message/ParameterizedMessageTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/message/ParameterizedMessageTest.java index ac9895e..c9dc152 100644 --- a/log4j-api/src/test/java/org/apache/logging/log4j/message/ParameterizedMessageTest.java +++ b/log4j-api/src/test/java/org/apache/logging/log4j/message/ParameterizedMessageTest.java @@ -39,6 +39,30 @@ public class ParameterizedMessageTest { } @Test + public void testZeroLength() { + final String testMsg = ""; + ParameterizedMessage msg = new ParameterizedMessage(testMsg, new String[]{"arg"}); + String result = msg.getFormattedMessage(); + assertEquals(testMsg, result); + final Object[] array = null; + msg = new ParameterizedMessage(testMsg, array, null); + result = msg.getFormattedMessage(); + assertEquals(testMsg, result); + } + + @Test + public void testOneCharLength() { + final String testMsg = "d"; + ParameterizedMessage msg = new ParameterizedMessage(testMsg, new String[]{"arg"}); + String result = msg.getFormattedMessage(); + assertEquals(testMsg, result); + final Object[] array = null; + msg = new ParameterizedMessage(testMsg, array, null); + result = msg.getFormattedMessage(); + assertEquals(testMsg, result); + } + + @Test public void testFormat3StringArgs() { final String testMsg = "Test message {}{} {}"; final String[] args = { "a", "b", "c" }; http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/8bd80f34/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 535e1ba..d884991 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -24,6 +24,9 @@ </properties> <body> <release version="2.7" date="2016-MM-DD" description="GA Release 2.7"> + <action issue="LOG4J2-1542" dev="rpopma" type="fix" due-to="Rogério Lecarião Leite"> + Prevent ArrayIndexOutOfBoundsException in ParameterizedMessage.formatTo for single-char or empty messages. + </action> <action issue="LOG4J2-1549" dev="mikes" type="fix" due-to="Jason Bedard"> AsyncLoggerContextSelector+PropertiesConfigurationBuilder defaults to includeLocation=true. </action>