Skip to content

Commit 93afabc

Browse files
bjlaubBrian Laub
andauthored
Fix ArrayIndexOutOfBoundsException in StatusData#getFormattedStatus (#3563)
Co-authored-by: Brian Laub <blaub@palantir.com>
1 parent b23e9a5 commit 93afabc

File tree

3 files changed

+66
-1
lines changed

3 files changed

+66
-1
lines changed
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to you under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
package org.apache.logging.log4j.status;
18+
19+
import static org.assertj.core.api.Assertions.assertThat;
20+
21+
import org.apache.logging.log4j.Level;
22+
import org.apache.logging.log4j.message.Message;
23+
import org.apache.logging.log4j.util.Constants;
24+
import org.junit.jupiter.api.Test;
25+
26+
public class StatusDataTest {
27+
@Test
28+
void test_getFormattedData_does_not_throw() {
29+
// ensure that getFormattedData() does not throw an ArrayIndexOutOfBoundsException when given
30+
// a message with a 0-length (non-null) parameters array
31+
32+
Message message = new Message() {
33+
@Override
34+
public String getFormattedMessage() {
35+
return "formatted";
36+
}
37+
38+
@Override
39+
public Object[] getParameters() {
40+
return Constants.EMPTY_OBJECT_ARRAY;
41+
}
42+
43+
@Override
44+
public Throwable getThrowable() {
45+
return null;
46+
}
47+
};
48+
49+
StatusData statusData = new StatusData(null, Level.ERROR, message, null, null);
50+
assertThat(statusData.getFormattedStatus()).contains("formatted");
51+
}
52+
}

log4j-api/src/main/java/org/apache/logging/log4j/status/StatusData.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,10 @@ public String getFormattedStatus() {
179179
sb.append(message.getFormattedMessage());
180180
final Object[] parameters = message.getParameters();
181181
Throwable effectiveThrowable;
182-
if (throwable == null && parameters != null && parameters[parameters.length - 1] instanceof Throwable) {
182+
if (throwable == null
183+
&& parameters != null
184+
&& parameters.length > 0
185+
&& parameters[parameters.length - 1] instanceof Throwable) {
183186
effectiveThrowable = (Throwable) parameters[parameters.length - 1];
184187
} else {
185188
effectiveThrowable = throwable;
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<entry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xmlns="https://logging.apache.org/xml/ns"
4+
xsi:schemaLocation="https://logging.apache.org/xml/ns https://logging.apache.org/xml/ns/log4j-changelog-0.xsd"
5+
type="fixed">
6+
<issue id="3562" link="https://github.com/apache/logging-log4j2/issues/3562"/>
7+
<description format="asciidoc">
8+
Fix `ArrayIndexOutOfBoundsException` on `StatusData#getFormattedStatus`.
9+
</description>
10+
</entry>

0 commit comments

Comments
 (0)