[ 
https://issues.apache.org/jira/browse/LOG4J2-2650?focusedWorklogId=272350&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-272350
 ]

ASF GitHub Bot logged work on LOG4J2-2650:
------------------------------------------

                Author: ASF GitHub Bot
            Created on: 04/Jul/19 19:43
            Start Date: 04/Jul/19 19:43
    Worklog Time Spent: 10m 
      Work Description: mattiabertorello commented on issue #290: [LOG4J2-2650] 
Fix ArrayIndexOutOfBoundsException when the mac variable is an ipv6
URL: https://github.com/apache/logging-log4j2/pull/290#issuecomment-508564354
 
 
   Yes you are right, I was not sure what part of the code fix. 
   Because I didn't think that the `NetUtils.getMacAddress` method should 
return also an emulate MAC. In fact this line `mac = localHost.getAddress();`  
was pretty obscure to me why was there.
   In any case I replace it with these lines 
   
   ```
   
   // Emulate a mac address with an IP v4 or v6
   final byte[] address = localHost.getAddress();
   // Take only 6 bytes if the address is an IPv6 otherwise will pad with two 
zero bytes
   mac = Arrays.copyOf(address, 6);
   ```
 
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


Issue Time Tracking
-------------------

    Worklog Id:     (was: 272350)
    Time Spent: 0.5h  (was: 20m)

> ArrayIndexOutOfBoundsException in the initialization of UuidUtil
> ----------------------------------------------------------------
>
>                 Key: LOG4J2-2650
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-2650
>             Project: Log4j 2
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 2.12.0
>         Environment: os : Mac OS
> java: 1.8 (jdk1.8.0_172.jdk)
> none network interfaces connected
>            Reporter: Mattia Bertorello
>            Priority: Major
>          Time Spent: 0.5h
>  Remaining Estimate: 0h
>
> Hi, 
> I found a problem in the UuidUtil initialization.
> The code that generate the exception
> {code:java}
>   private static Logger log = LogManager.getLogger(MyClass.class);
> {code}
> This code return a ip address of localhost and when the stack is IPv4 return 
> 4 bytes but when the default stack is IPv6 it's going to return 16 bytes.
>   
> [NetUtils.java#L108|https://github.com/apache/logging-log4j2/blob/da539329d528d979f4dd385a6ebb639793ef37bd/log4j-core/src/main/java/org/apache/logging/log4j/core/util/NetUtils.java#L108]
> {code:java}
> if (mac == null || mac.length == 0) { 
>    mac = localHost.getAddress(); 
> }
> {code}
> This is the part that generate the ArrayIndexOutOfBoundsException
>  
> [UuidUtil.java#L81|https://github.com/apache/logging-log4j2/blob/da539329d528d979f4dd385a6ebb639793ef37bd/log4j-core/src/main/java/org/apache/logging/log4j/core/util/UuidUtil.java#L81]
> {code:java}
> System.arraycopy(mac, index, node, index + 2, length);{code}
> These 16 bytes will generate a wrong destination index that exceed the length 
> of the node array.
> {noformat}
> mac = {byte[16]@3217} 
> length = 6 
> index = 10 
> node = {byte[8]@3222}
> {noformat}
> This is the complete exception  
> {code}
> 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:79) 
> at 
> org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.createContext(ClassLoaderContextSelector.java:171)
>  at 
> org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.locateContext(ClassLoaderContextSelector.java:145)
>  at 
> org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:70)
>  at 
> org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:57)
>  at 
> org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:148)
>  at 
> org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:45)
>  at org.apache.logging.log4j.LogManager.getContext(LogManager.java:194) at 
> org.apache.logging.log4j.LogManager.getLogger(LogManager.java:581) at 
> cc.arduino.contributions.packages.ContributionInstaller.<clinit>(ContributionInstaller.java:66)
>  at processing.app.Base.<init>(Base.java:291) at 
> processing.app.Base.main(Base.java:150) Caused by: 
> java.lang.ArrayIndexOutOfBoundsException at java.lang.System.arraycopy(Native 
> Method) at 
> org.apache.logging.log4j.core.util.UuidUtil.<clinit>(UuidUtil.java:81) ... 15 
> more
> {code}
> To reproduce the exception you need
>  * disconnect every network interface
>  * verify that java will use the IPv6 stack -Djava.net.preferIPv4Stack=false 
> -Djava.net.preferIPv6Addresses=true
>  * Initialize a log of log4j
> I suggest different solution:
>  - Remove  
> [NetUtils.java#L108|https://github.com/apache/logging-log4j2/blob/da539329d528d979f4dd385a6ebb639793ef37bd/log4j-core/src/main/java/org/apache/logging/log4j/core/util/NetUtils.java#L108]
>  and return always null (when the other code fail to init the mac variable ) 
> because in general the method is called getMacAddress but in that particular 
> case will return and IP address 
>  - Mange the IPv6 case in the static part of the class UuidUtil 
> [UuidUtil.java#L81|https://github.com/apache/logging-log4j2/blob/da539329d528d979f4dd385a6ebb639793ef37bd/log4j-core/src/main/java/org/apache/logging/log4j/core/util/UuidUtil.java#L81]



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to