diff --git a/src/libraries/System.IO.Pipelines/src/System/IO/Pipelines/StreamPipeReader.cs b/src/libraries/System.IO.Pipelines/src/System/IO/Pipelines/StreamPipeReader.cs index 76864742a8875d..41a9ffedf75ebe 100644 --- a/src/libraries/System.IO.Pipelines/src/System/IO/Pipelines/StreamPipeReader.cs +++ b/src/libraries/System.IO.Pipelines/src/System/IO/Pipelines/StreamPipeReader.cs @@ -106,9 +106,12 @@ private void AdvanceTo(BufferSegment? consumedSegment, int consumedIndex, Buffer long consumedBytes = BufferSegment.GetLength(returnStart, _readIndex, consumedSegment, consumedIndex); - _bufferedBytes -= consumedBytes; + if (consumedBytes < 0 || consumedBytes > _bufferedBytes) + { + ThrowHelper.ThrowInvalidOperationException_AdvanceToInvalidCursor(); + } - Debug.Assert(_bufferedBytes >= 0); + _bufferedBytes -= consumedBytes; _examinedEverything = false; diff --git a/src/libraries/System.IO.Pipelines/tests/StreamPipeReaderTests.cs b/src/libraries/System.IO.Pipelines/tests/StreamPipeReaderTests.cs index 9fa3e33945b932..3bf37d8d870ca2 100644 --- a/src/libraries/System.IO.Pipelines/tests/StreamPipeReaderTests.cs +++ b/src/libraries/System.IO.Pipelines/tests/StreamPipeReaderTests.cs @@ -570,6 +570,22 @@ public async Task InvalidCursorThrows() reader.Complete(); } + [Fact] + public async Task AdvanceWithPositionFromDifferentReaderThrows() + { + PipeReader reader1 = PipeReader.Create(new MemoryStream(new byte[10])); + PipeReader reader2 = PipeReader.Create(new MemoryStream(new byte[1000])); + + ReadResult result1 = await reader1.ReadAsync(); + ReadResult result2 = await reader2.ReadAsync(); + + SequencePosition posFrom2 = result2.Buffer.End; + Assert.Throws(() => reader1.AdvanceTo(posFrom2)); + + reader1.Complete(); + reader2.Complete(); + } + [Fact] public void NullStreamThrows() {