only set next segment if Sequence spans multiple segments (#276)
authorVladislav Richter <shutdown256@gmail.com>
Thu, 26 Dec 2019 23:47:48 +0000 (00:47 +0100)
committerDan Moseley <danmose@microsoft.com>
Thu, 26 Dec 2019 23:47:48 +0000 (15:47 -0800)
src/libraries/System.Memory/src/System/Buffers/ReadOnlySequence.Helpers.cs
src/libraries/System.Memory/tests/SequenceReader/ReadTo.cs

index a509fef..56afdd3 100644 (file)
@@ -649,11 +649,11 @@ namespace System.Buffers
                     {
                         // Positive start and end index == ReadOnlySequenceSegment<T>
                         ReadOnlySequenceSegment<T> segment = (ReadOnlySequenceSegment<T>)startObject;
-                        next = new SequencePosition(segment.Next, 0);
                         first = segment.Memory.Span;
                         if (hasMultipleSegments)
                         {
                             first = first.Slice(startIndex);
+                            next = new SequencePosition(segment.Next, 0);
                         }
                         else
                         {
index f76d2a7..e69a0e6 100644 (file)
@@ -198,5 +198,17 @@ namespace System.Memory.Tests.SequenceReader
                 Assert.Equal(i + 1, value);
             }
         }
+
+        [Fact]
+        public void TryReadTo_Span_At_Segments_Boundary()
+        {
+            Span<byte> delimiter = new byte[] { 13, 10 }; // \r\n
+            BufferSegment<byte> segment = new BufferSegment<byte>(Text.Encoding.ASCII.GetBytes("Hello\r"));
+            segment.Append(Text.Encoding.ASCII.GetBytes("\nWorld")); // add next segment
+            ReadOnlySequence<byte> inputSeq = new ReadOnlySequence<byte>(segment, 0, segment, 6); // span only the first segment!
+            SequenceReader<byte> sr = new SequenceReader<byte>(inputSeq);
+            bool r = sr.TryReadTo(out _, delimiter);
+            Assert.False(r);
+        }
     }
 }