[ 
https://issues.apache.org/jira/browse/ARTEMIS-4340?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Robbie Gemmell updated ARTEMIS-4340:
------------------------------------
        Fix Version/s: 2.30.0
    Affects Version/s: 2.29.0
          Description: 
Report was made (see below) about ByteUtil.uncheckedZeros throwing 
IndexOutOfBoundsException. Though some of ByteUtil's behaviour can perhaps be 
questioned, the problem ultimately starts earlier in the call tree with 
ThreadLocalByteBufferPool.borrow(int, boolean) from artemis-journal passing it 
invalid arguments. It passed in a buffer for zeroing, with its limit still set 
below the requested size to be zero'd, leading to the IndexOutOfBoundsException 
when trying to write beyond the limit.

The reason this seemingly long-standing bug has perhaps not been hit so far is 
that it occurs in a less typical fallback case, where the buffer either isnt 
direct _and_ able to be updated with Netty's Unsafe bits, or also doesn't have 
an array.

ThreadLocalByteBufferPool should clear position+limit before zeroing the buffer.

 

Original Description:

=================

In artemis-commons:

ByteUtil.uncheckedZeros throws IndexOutOfBoundsException in the else part of 
the method.

The code in the else part is looping through number of bytes specified by bytes 
input parameter which is often provided by buffer.capacity(), but then the code 
at 

buffer.put(i + offset, zero) where buffer is of DirectByteBuffer type calls 
checkIndex(int i) and it throws if i is >= limit.

But limit is not the same as capacity in a Buffer.  In our case capacity is 
4096 and limit is 16 so method always throws IndexOutOfBoundsException if the 
else case is executed as soon as i ==16.

This code is called when Artemis is launched and it validates/creates the 
various bindings files.  This causes Artemis to fail to load properly.

Note I believe all versions of artemis-commons has this bug but I currently am 
testing with 2.22.0.

  was:
In artemis-commons:

ByteUtil.uncheckedZeros throws IndexOutOfBoundsException in the else part of 
the method.

The code in the else part is looping through number of bytes specified by bytes 
input parameter which is often provided by buffer.capacity(), but then the code 
at 

buffer.put(i + offset, zero) where buffer is of DirectByteBuffer type calls 
checkIndex(int i) and it throws if i is >= limit.

But limit is not the same as capacity in a Buffer.  In our case capacity is 
4096 and limit is 16 so method always throws IndexOutOfBoundsException if the 
else case is executed as soon as i ==16.

This code is called when Artemis is launched and it validates/creates the 
various bindings files.  This causes Artemis to fail to load properly.

Note I believe all versions of artemis-commons has this bug but I currently am 
testing with 2.22.0.

              Summary: fix artemis-journal ThreadLocalByteBufferPool.borrow 
zeroing  (was: ByteUtil.uncheckedZeros throws IndexOutOfBoundsException in else 
condition)

> fix artemis-journal ThreadLocalByteBufferPool.borrow zeroing
> ------------------------------------------------------------
>
>                 Key: ARTEMIS-4340
>                 URL: https://issues.apache.org/jira/browse/ARTEMIS-4340
>             Project: ActiveMQ Artemis
>          Issue Type: Bug
>    Affects Versions: 2.22.0, 2.29.0
>         Environment: Windows 10, Linux
>            Reporter: David Hoffer
>            Assignee: Robbie Gemmell
>            Priority: Major
>             Fix For: 2.30.0
>
>          Time Spent: 1h 20m
>  Remaining Estimate: 0h
>
> Report was made (see below) about ByteUtil.uncheckedZeros throwing 
> IndexOutOfBoundsException. Though some of ByteUtil's behaviour can perhaps be 
> questioned, the problem ultimately starts earlier in the call tree with 
> ThreadLocalByteBufferPool.borrow(int, boolean) from artemis-journal passing 
> it invalid arguments. It passed in a buffer for zeroing, with its limit still 
> set below the requested size to be zero'd, leading to the 
> IndexOutOfBoundsException when trying to write beyond the limit.
> The reason this seemingly long-standing bug has perhaps not been hit so far 
> is that it occurs in a less typical fallback case, where the buffer either 
> isnt direct _and_ able to be updated with Netty's Unsafe bits, or also 
> doesn't have an array.
> ThreadLocalByteBufferPool should clear position+limit before zeroing the 
> buffer.
>  
> Original Description:
> =================
> In artemis-commons:
> ByteUtil.uncheckedZeros throws IndexOutOfBoundsException in the else part of 
> the method.
> The code in the else part is looping through number of bytes specified by 
> bytes input parameter which is often provided by buffer.capacity(), but then 
> the code at 
> buffer.put(i + offset, zero) where buffer is of DirectByteBuffer type calls 
> checkIndex(int i) and it throws if i is >= limit.
> But limit is not the same as capacity in a Buffer.  In our case capacity is 
> 4096 and limit is 16 so method always throws IndexOutOfBoundsException if the 
> else case is executed as soon as i ==16.
> This code is called when Artemis is launched and it validates/creates the 
> various bindings files.  This causes Artemis to fail to load properly.
> Note I believe all versions of artemis-commons has this bug but I currently 
> am testing with 2.22.0.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to