Skip to content

Commit aa1fa5b

Browse files
committed
Fix bug MessageUnpacker#prepareNumberBuffer reads updated buffer
1 parent de7056a commit aa1fa5b

File tree

2 files changed

+37
-3
lines changed

2 files changed

+37
-3
lines changed

msgpack-core/src/main/java/org/msgpack/core/MessageUnpacker.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -211,15 +211,16 @@ private MessageBuffer prepareNumberBuffer(int readLength)
211211
else {
212212
// When the default buffer doesn't contain the whole length
213213

214-
// TODO loop this method until castBuffer is filled
215-
MessageBuffer next = getNextBuffer();
216-
217214
if (remaining > 0) {
218215
// TODO This doesn't work if MessageBuffer is allocated by newDirectBuffer.
219216
// Add copy method to MessageBuffer to solve this issue.
220217

221218
// Copy the data fragment from the current buffer
222219
numberBuffer.putBytes(0, buffer.array(), buffer.arrayOffset() + position, remaining);
220+
221+
// TODO loop this method until castBuffer is filled
222+
MessageBuffer next = getNextBuffer();
223+
223224
numberBuffer.putBytes(remaining, next.array(), next.arrayOffset(), readLength - remaining);
224225

225226
buffer = next;
@@ -229,6 +230,9 @@ private MessageBuffer prepareNumberBuffer(int readLength)
229230
return numberBuffer; // Return the numberBuffer
230231
}
231232
else {
233+
// TODO loop this method until castBuffer is filled
234+
MessageBuffer next = getNextBuffer();
235+
232236
buffer = next;
233237
position = readLength;
234238
nextReadPosition = 0;

msgpack-core/src/test/scala/org/msgpack/core/MessageUnpackerTest.scala

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package org.msgpack.core
1717

1818
import java.io._
1919
import java.nio.ByteBuffer
20+
import java.util.concurrent.{Callable, Executors}
2021

2122
import org.msgpack.core.buffer._
2223
import org.msgpack.value.ValueType
@@ -687,5 +688,34 @@ class MessageUnpackerTest extends MessagePackSpec {
687688
Seq(8185, 8186, 8187, 8188, 16377, 16378, 16379, 16380).foreach { n => check(s, n)}
688689
}
689690
}
691+
692+
"unpack" in {
693+
val output = new PipedOutputStream
694+
val input = new PipedInputStream(output)
695+
val executor = Executors.newCachedThreadPool
696+
697+
val msgpack06 = new org.msgpack.MessagePack
698+
val packer06 = msgpack06.createPacker(output)
699+
val future = executor.submit(new Callable[Void]
700+
{
701+
override def call(): Void = {
702+
try {
703+
for (i <- 0 to 500) {
704+
packer06.write(0x0011223344556677L)
705+
}
706+
}
707+
finally {
708+
packer06.close
709+
}
710+
return null
711+
}
712+
})
713+
714+
val unpacker = MessagePack.newDefaultUnpacker(input)
715+
for (i <- 0 to 500) {
716+
unpacker.unpackLong shouldBe 0x0011223344556677L
717+
}
718+
unpacker.close
719+
}
690720
}
691721
}

0 commit comments

Comments
 (0)