Skip to content

Commit c525ef6

Browse files
committed
Fixes a bug in UnsafeBuffer.wrap with raw memory address.
The wrapAdjustment isn't reset when calling with a raw memory address. The consequence is that you access memory at the wrong position because the wrapAdjustment still has the value of an earlier wrap.
1 parent fd17a3e commit c525ef6

2 files changed

Lines changed: 20 additions & 0 deletions

File tree

agrona/src/main/java/org/agrona/concurrent/UnsafeBuffer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,7 @@ public void wrap(final long address, final int length)
321321
addressOffset = address;
322322
byteArray = null;
323323
byteBuffer = null;
324+
wrapAdjustment = 0;
324325
}
325326

326327
/**

agrona/src/test/java/org/agrona/concurrent/UnsafeBufferTest.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package org.agrona.concurrent;
1717

18+
import org.agrona.BufferUtil;
1819
import org.agrona.DirectBuffer;
1920
import org.agrona.ExpandableArrayBuffer;
2021
import org.agrona.ExpandableDirectByteBuffer;
@@ -325,4 +326,22 @@ private static List<DirectBuffer> directBuffers()
325326
new UnsafeBuffer(ByteBuffer.allocate(64)),
326327
mockBuffer);
327328
}
329+
330+
@Test
331+
public void wrapForRawMemoryAddressShouldResetWrapAdjustment()
332+
{
333+
final UnsafeBuffer buffer = new UnsafeBuffer();
334+
335+
// first we set a non zero wrap adjustment
336+
final byte[] array = new byte[100];
337+
buffer.wrap(array, 25, 50);
338+
339+
// now a wrap is done with a raw memory address which should reset the wrap adjustment.
340+
final ByteBuffer directBuffer = ByteBuffer.allocateDirect(64);
341+
final long address = BufferUtil.address(directBuffer);
342+
buffer.wrap(address, 64);
343+
344+
assertEquals(0, buffer.wrapAdjustment());
345+
}
346+
328347
}

0 commit comments

Comments
 (0)