Skip to content

MessagePacker can't pack read only ByteBuffer #232

@fdinoff

Description

@fdinoff

The following crashes with an IllegalArgumentException

byte[] payload = new byte[] { 1 };
ByteBuffer buffer = ByteBuffer.wrap(payload).asReadOnlyBuffer();
ByteArrayOutputStream out = new ByteArrayOutputStream();
MessagePack.newDefaultPacker(out)
        .packBinaryHeader(1)
        .writePayload(buffer)
        .flush();
java.lang.IllegalArgumentException
    at java.nio.Buffer.position(Buffer.java:244)
    at org.msgpack.core.buffer.MessageBuffer.putByteBuffer(MessageBuffer.java:437)
    at org.msgpack.core.MessagePacker.writePayload(MessagePacker.java:574)

A possible patch

diff --git a/msgpack-core/src/main/java/org/msgpack/core/buffer/MessageBuffer.java b/msgpack-core/src/main/java/org/msgpack/core/buffer/MessageBuffer.java
index 50a84ac..8577504 100644
--- a/msgpack-core/src/main/java/org/msgpack/core/buffer/MessageBuffer.java
+++ b/msgpack-core/src/main/java/org/msgpack/core/buffer/MessageBuffer.java
@@ -419,10 +419,12 @@ public class MessageBuffer {

         if(src.isDirect()) {
             unsafe.copyMemory(null, DirectBufferAccess.getAddress(src) + src.position(), base, address + index, len);
+            src.position(src.position() + len);
         }
         else if(src.hasArray()) {
             byte[] srcArray = src.array();
             unsafe.copyMemory(srcArray, ARRAY_BYTE_BASE_OFFSET + src.position(), base, address + index, len);
+            src.position(src.position() + len);
         }
         else {
             if(base != null) {
@@ -434,7 +436,6 @@ public class MessageBuffer {
                 }
             }
         }
-        src.position(src.position() + len);
     }

     /**

The position is modified when you call get on the byte buffer and modifying the position again is wrong since it goes over the end of the buffer or loses value.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions