[
https://issues.apache.org/jira/browse/ARTEMIS-4340?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Robbie Gemmell resolved ARTEMIS-4340.
-------------------------------------
Resolution: Fixed
> 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)