From 8286ecffc52ca056f5584018661ffab4ef41b099 Mon Sep 17 00:00:00 2001 From: Doug Roper Date: Thu, 24 May 2018 03:11:50 -0400 Subject: [PATCH] Fix MultiByteArrayIterator.copyToArray silently drops bytes. #16303 (#25141) I just got burned by #16303. Answering https://github.com/akka/akka/issues/16303#issuecomment-62957914, it looks like `copyToArray[B >: Byte](Array[B])` can't call `getBytes(Array[Byte], Int, Int)` due to the type constraint (defined by `GenTraversableOnce`). Instead, I'm going with the simple `isEmpty` solution proposed in the description of #16303 by @kpatrick-kixeye. --- .../src/test/scala/akka/util/ByteStringSpec.scala | 9 +++++++++ akka-actor/src/main/scala/akka/util/ByteIterator.scala | 4 +++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/akka-actor-tests/src/test/scala/akka/util/ByteStringSpec.scala b/akka-actor-tests/src/test/scala/akka/util/ByteStringSpec.scala index b7c9b5d4ce..c00056a3e8 100644 --- a/akka-actor-tests/src/test/scala/akka/util/ByteStringSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/util/ByteStringSpec.scala @@ -895,6 +895,15 @@ class ByteStringSpec extends WordSpec with Matchers with Checkers { bytes == array.toSeq } } + + "copying chunks to an array" in { + val iterator = (ByteString("123") ++ ByteString("456")).iterator + val array = Array.ofDim[Byte](6) + iterator.copyToArray(array, 0, 2) + iterator.copyToArray(array, 2, 2) + iterator.copyToArray(array, 4, 2) + assert(new String(array) === "123456") + } } "decode data correctly" when { diff --git a/akka-actor/src/main/scala/akka/util/ByteIterator.scala b/akka-actor/src/main/scala/akka/util/ByteIterator.scala index 5865555785..9560248fec 100644 --- a/akka-actor/src/main/scala/akka/util/ByteIterator.scala +++ b/akka-actor/src/main/scala/akka/util/ByteIterator.scala @@ -290,7 +290,9 @@ object ByteIterator { current.copyToArray(xs, pos, n) pos += n rest -= n - dropCurrent() + if (current.isEmpty) { + dropCurrent() + } } normalize() }