diff --git a/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/MemoryPoolIterator2.cs b/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/MemoryPoolIterator2.cs index 7e409153c4..467db4993d 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/MemoryPoolIterator2.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/MemoryPoolIterator2.cs @@ -442,6 +442,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Infrastructure else { Buffer.BlockCopy(block.Array, index, array, offset, following); + offset += following; remaining -= following; block = block.Next; index = block.Start; diff --git a/test/Microsoft.AspNet.Server.KestrelTests/MemoryPoolBlock2Tests.cs b/test/Microsoft.AspNet.Server.KestrelTests/MemoryPoolBlock2Tests.cs index 2f43e0239d..9f87347292 100644 --- a/test/Microsoft.AspNet.Server.KestrelTests/MemoryPoolBlock2Tests.cs +++ b/test/Microsoft.AspNet.Server.KestrelTests/MemoryPoolBlock2Tests.cs @@ -117,6 +117,41 @@ namespace Microsoft.AspNet.Server.KestrelTests } } + [Fact] + public void CopyToCorrectlyTraversesBlocks() + { + using (var pool = new MemoryPool2()) + { + var block1 = pool.Lease(128); + var block2 = block1.Next = pool.Lease(128); + + for (int i = 0; i < 128; i++) + { + block1.Array[block1.End++] = (byte)i; + } + for (int i = 128; i < 256; i++) + { + block2.Array[block2.End++] = (byte)i; + } + + var beginIterator = block1.GetIterator(); + + var array = new byte[256]; + int actual; + var endIterator = beginIterator.CopyTo(array, 0, 256, out actual); + + Assert.Equal(256, actual); + + for (int i = 0; i < 256; i++) + { + Assert.Equal(i, array[i]); + } + + endIterator.CopyTo(array, 0, 256, out actual); + Assert.Equal(0, actual); + } + } + private void AssertIterator(MemoryPoolIterator2 iter, MemoryPoolBlock2 block, int index) { Assert.Same(block, iter.Block);