diff --git a/memory/memory-netty/src/test/java/org/apache/arrow/memory/netty/TestEmptyArrowBuf.java b/memory/memory-netty/src/test/java/org/apache/arrow/memory/netty/TestEmptyArrowBuf.java index 3ce0705b4e..6426193246 100644 --- a/memory/memory-netty/src/test/java/org/apache/arrow/memory/netty/TestEmptyArrowBuf.java +++ b/memory/memory-netty/src/test/java/org/apache/arrow/memory/netty/TestEmptyArrowBuf.java @@ -19,7 +19,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; -import io.netty.buffer.PooledByteBufAllocatorL; import org.apache.arrow.memory.ArrowBuf; import org.apache.arrow.memory.ReferenceManager; import org.apache.arrow.memory.RootAllocator; @@ -57,39 +56,38 @@ public void testZeroBuf() { @Test public void testEmptyArrowBuf() { - ArrowBuf buf = - new ArrowBuf( - ReferenceManager.NO_OP, - null, - 1024, - new PooledByteBufAllocatorL().empty.memoryAddress()); + // Back the buffer with real memory of the declared capacity. The writes below would otherwise + // run past the end of the native allocation and could corrupt the native heap. + try (ArrowBuf memory = allocator.buffer(1024)) { + ArrowBuf buf = new ArrowBuf(ReferenceManager.NO_OP, null, 1024, memory.memoryAddress()); - buf.getReferenceManager().retain(); - buf.getReferenceManager().retain(8); - assertEquals(1024, buf.capacity()); - assertEquals(1, buf.getReferenceManager().getRefCount()); - assertEquals(0, buf.getActualMemoryConsumed()); + buf.getReferenceManager().retain(); + buf.getReferenceManager().retain(8); + assertEquals(1024, buf.capacity()); + assertEquals(1, buf.getReferenceManager().getRefCount()); + assertEquals(0, buf.getActualMemoryConsumed()); - for (int i = 0; i < 10; i++) { - buf.setByte(i, i); - } - assertEquals(0, buf.getActualMemoryConsumed()); - assertEquals(0, buf.getReferenceManager().getSize()); - assertEquals(0, buf.getReferenceManager().getAccountedSize()); - assertFalse(buf.getReferenceManager().release()); - assertFalse(buf.getReferenceManager().release(2)); - assertEquals(0, buf.getReferenceManager().getAllocator().getLimit()); - assertEquals( - buf, buf.getReferenceManager().transferOwnership(buf, allocator).getTransferredBuffer()); - assertEquals(0, buf.readerIndex()); - assertEquals(0, buf.writerIndex()); - assertEquals(1, buf.refCnt()); + for (int i = 0; i < 10; i++) { + buf.setByte(i, i); + } + assertEquals(0, buf.getActualMemoryConsumed()); + assertEquals(0, buf.getReferenceManager().getSize()); + assertEquals(0, buf.getReferenceManager().getAccountedSize()); + assertFalse(buf.getReferenceManager().release()); + assertFalse(buf.getReferenceManager().release(2)); + assertEquals(0, buf.getReferenceManager().getAllocator().getLimit()); + assertEquals( + buf, buf.getReferenceManager().transferOwnership(buf, allocator).getTransferredBuffer()); + assertEquals(0, buf.readerIndex()); + assertEquals(0, buf.writerIndex()); + assertEquals(1, buf.refCnt()); - ArrowBuf derive = buf.getReferenceManager().deriveBuffer(buf, 0, 100); - assertEquals(derive, buf); - assertEquals(1, buf.refCnt()); - assertEquals(1, derive.refCnt()); + ArrowBuf derive = buf.getReferenceManager().deriveBuffer(buf, 0, 100); + assertEquals(derive, buf); + assertEquals(1, buf.refCnt()); + assertEquals(1, derive.refCnt()); - buf.close(); + buf.close(); + } } }