From bf2c2d945e40c3bc660408d459fd868605c92ded Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Tue, 16 Apr 2019 10:38:51 +0100 Subject: [PATCH 1/3] Add failing unit test to show the bug --- .../MessagePackReaderTests.ReadString.cs | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 tests/MessagePack.Tests/MessagePackReaderTests.ReadString.cs diff --git a/tests/MessagePack.Tests/MessagePackReaderTests.ReadString.cs b/tests/MessagePack.Tests/MessagePackReaderTests.ReadString.cs new file mode 100644 index 000000000..a4174bbf7 --- /dev/null +++ b/tests/MessagePack.Tests/MessagePackReaderTests.ReadString.cs @@ -0,0 +1,59 @@ +using System; +using System.Buffers; +using Xunit; + +namespace MessagePack.Tests +{ + partial class MessagePackReaderTests + { + [Fact] + public void ReadString_HandlesSingleSegment() + { + var seq = BuildSequence(new[] { + (byte)(MessagePackCode.MinFixStr + 2), + (byte)'A', (byte)'B' }); + + var reader = new MessagePackReader(seq); + var result = reader.ReadString(); + Assert.Equal("AB", result); + } + + [Fact] + public void ReadString_HandlesMultipleSegments() + { + var seq = BuildSequence( + new[] { (byte)(MessagePackCode.MinFixStr + 2), (byte)'A' }, + new[] { (byte)'B' }); + + var reader = new MessagePackReader(seq); + var result = reader.ReadString(); + Assert.Equal("AB", result); + } + + ReadOnlySequence BuildSequence(params T[][] segmentContents) + { + var segments = new TestSequenceSegment[segmentContents.Length]; + TestSequenceSegment last = null; + for (var i = 0; i < segmentContents.Length; i++) + { + last = segments[i] = new TestSequenceSegment(segmentContents[i], last); + } + + return new ReadOnlySequence(segments[0], 0, last, last.Memory.Length); + } + + class TestSequenceSegment : ReadOnlySequenceSegment + { + public TestSequenceSegment(T[] data, TestSequenceSegment prev = null) + { + Memory = new Memory(data); + + if (prev != null) + { + prev.Next = this; + RunningIndex = prev.RunningIndex + prev.Memory.Length; + } + } + } + } +} From bd6ed42d202f4d645cbe3286e9cb83b6fc3395bb Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Tue, 16 Apr 2019 10:40:38 +0100 Subject: [PATCH 2/3] Fix the bug so test now passes --- src/MessagePack/MessagePackReader.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/MessagePack/MessagePackReader.cs b/src/MessagePack/MessagePackReader.cs index 9d49bf7c6..1244e83f6 100644 --- a/src/MessagePack/MessagePackReader.cs +++ b/src/MessagePack/MessagePackReader.cs @@ -805,6 +805,7 @@ private string ReadStringSlow(int byteLength) } } #endif + reader.Advance(bytesRead); } string value = new string(charArray, 0, initializedChars); From 0eef1678c4e9f9af06ce7fa4d631f2fbc12933d9 Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Tue, 16 Apr 2019 10:54:58 +0100 Subject: [PATCH 3/3] Match local code style --- src/MessagePack/MessagePackReader.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MessagePack/MessagePackReader.cs b/src/MessagePack/MessagePackReader.cs index 1244e83f6..faa63cf5c 100644 --- a/src/MessagePack/MessagePackReader.cs +++ b/src/MessagePack/MessagePackReader.cs @@ -805,7 +805,7 @@ private string ReadStringSlow(int byteLength) } } #endif - reader.Advance(bytesRead); + this.reader.Advance(bytesRead); } string value = new string(charArray, 0, initializedChars);