You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@logging.apache.org by "Ralph Goers (Jira)" <ji...@apache.org> on 2019/12/03 06:03:00 UTC
[jira] [Resolved] (LOG4J2-2707) ArrayIndexOutOfBoundsException in
UuidUtil, when MAC address is longer than 6 bytes
[ https://issues.apache.org/jira/browse/LOG4J2-2707?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Ralph Goers resolved LOG4J2-2707.
---------------------------------
Fix Version/s: 2.13.0
Resolution: Fixed
The patch has been applied. Please verify and close.
> ArrayIndexOutOfBoundsException in UuidUtil, when MAC address is longer than 6 bytes
> -----------------------------------------------------------------------------------
>
> Key: LOG4J2-2707
> URL: https://issues.apache.org/jira/browse/LOG4J2-2707
> Project: Log4j 2
> Issue Type: Bug
> Components: Core
> Affects Versions: 2.12.1
> Reporter: Christian Frank
> Priority: Major
> Labels: easyfix
> Fix For: 2.13.0
>
> Time Spent: 1h 40m
> Remaining Estimate: 0h
>
> *Problem:*
> There is a Bug in the UuidUtil class, which causes an ArrayIndexOutOfBoundsException, when the MAC address is longer than 6 bytes.
> Here's the code:
> {code:java}
> private static final int NODE_SIZE = 8;
> {code}
> {code:java}
> byte[] mac = NetUtils.getMacAddress();
> final Random randomGenerator = new SecureRandom();
> if (mac == null || mac.length == 0) {
> mac = new byte[6];
> randomGenerator.nextBytes(mac);
> }
> final int length = mac.length >= 6 ? 6 : mac.length;
> final int index = mac.length >= 6 ? mac.length - 6 : 0;
> final byte[] node = new byte[NODE_SIZE];
> node[0] = VARIANT;
> node[1] = 0;
> for (int i = 2; i < NODE_SIZE; ++i) {
> node[i] = 0;
> }
> System.arraycopy(mac, index, node, index + 2, length);
> {code}
> The problem is the System.arraycopy call, when the MAC address is longer than 6 bytes.
> Here's a table, with the different cases:
> ||mac.length||length||index||System.arraycopy||
> |0|0|0|System.arraycopy(mac, 0, node, 2, 0);|
> |1|1|0|System.arraycopy(mac, 0, node, 2, 1);|
> |2|2|0|System.arraycopy(mac, 0, node, 2, 2);|
> |3|3|0|System.arraycopy(mac, 0, node, 2, 3);|
> |4|4|0|System.arraycopy(mac, 0, node, 2, 4);|
> |5|5|0|System.arraycopy(mac, 0, node, 2, 5);|
> |6|6|0|System.arraycopy(mac, 0, node, 2, 6);|
> |7|6|1|System.arraycopy(mac, 1, node, 3, 6);|
> |8|6|2|System.arraycopy(mac, 2, node, 4, 6);|
> mac.length from 0 to 6 work fine.
> But for mac.length 7, 8 and above the System.arraycopy call will throw an ArrayIndexOutOfBoundsException, because it tries to write to positions on node array, which do not exist.
> For example for mac.length 8, the call would try to write to positions 8 and 9 on node, which do not exists, since node is 8 bytes.
>
> Here's the Stacktrace we encountered:
>
> {noformat}
> java.lang.ExceptionInInitializerError
> at org.apache.logging.log4j.core.util.WatchManager.<init>(WatchManager.java:53)
> at org.apache.logging.log4j.core.config.AbstractConfiguration.<init>(AbstractConfiguration.java:135)
> at org.apache.logging.log4j.core.config.NullConfiguration.<init>(NullConfiguration.java:32)
> at org.apache.logging.log4j.core.LoggerContext.<clinit>(LoggerContext.java:85)
> at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.createContext(ClassLoaderContextSelector.java:179)
> at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.locateContext(ClassLoaderContextSelector.java:153)
> at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:82)
> at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:170)
> at org.apache.logging.log4j.core.config.Configurator.initialize(Configurator.java:86)
> at org.apache.logging.log4j.core.config.Configurator.initialize(Configurator.java:67)
> [...]
> Caused by: java.lang.ArrayIndexOutOfBoundsException
> at java.lang.System.arraycopy(Native Method)
> at org.apache.logging.log4j.core.util.UuidUtil.<clinit>(UuidUtil.java:81)
> ... 13 more{noformat}
>
> *Solution:*
> The code can be fixed by always using 2 for destPos:
> {code:java}
> System.arraycopy(mac, index, node, 2, length);
> {code}
>
--
This message was sent by Atlassian Jira
(v8.3.4#803005)