From 7c5ecf2836303a68acd3b84de1a6b71a4ba10c5c Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Tue, 13 Apr 2021 00:30:40 +0200 Subject: [PATCH 1/2] add a failing test that mimcs the SDK bug --- .../FileStream/FileStreamConformanceTests.cs | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/libraries/System.IO.FileSystem/tests/FileStream/FileStreamConformanceTests.cs b/src/libraries/System.IO.FileSystem/tests/FileStream/FileStreamConformanceTests.cs index 82b10a882c3d38..52823de458d882 100644 --- a/src/libraries/System.IO.FileSystem/tests/FileStream/FileStreamConformanceTests.cs +++ b/src/libraries/System.IO.FileSystem/tests/FileStream/FileStreamConformanceTests.cs @@ -161,6 +161,31 @@ public async Task LengthIsNotCachedAfterHandleHasBeenExposed(FileAccess fileAcce Assert.Equal(2, stream.Length); Assert.Equal(2, createdFromHandle.Length); } + + [Fact] + public async Task WriteByteFlushesTheBufferWhenItBecomesFull() + { + string filePath; + List writtenBytes = new List(); + + using (FileStream stream = (FileStream)await CreateWriteOnlyStreamCore(Array.Empty())) + { + filePath = stream.Name; + + stream.WriteByte(0); + writtenBytes.Add(0); + + byte[] bytes = new byte[BufferSize - 1]; + stream.Write(bytes.AsSpan()); + writtenBytes.AddRange(bytes); + + stream.WriteByte(1); + writtenBytes.Add(1); + } + + byte[] allBytes = File.ReadAllBytes(filePath); + Assert.Equal(writtenBytes.ToArray(), allBytes); + } } public class UnbufferedSyncFileStreamStandaloneConformanceTests : FileStreamStandaloneConformanceTests From 0b1742b4c665c0a962742a8eb97331b6debf629b Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Tue, 13 Apr 2021 00:31:56 +0200 Subject: [PATCH 2/2] fix the buffering bug --- .../src/System/IO/Strategies/BufferedFileStreamStrategy.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/IO/Strategies/BufferedFileStreamStrategy.cs b/src/libraries/System.Private.CoreLib/src/System/IO/Strategies/BufferedFileStreamStrategy.cs index 2b914e7bc0aec1..96094cf01e7aa3 100644 --- a/src/libraries/System.Private.CoreLib/src/System/IO/Strategies/BufferedFileStreamStrategy.cs +++ b/src/libraries/System.Private.CoreLib/src/System/IO/Strategies/BufferedFileStreamStrategy.cs @@ -602,7 +602,7 @@ private void WriteByteSlow(byte value) ClearReadBufferBeforeWrite(); EnsureBufferAllocated(); } - else if (_writePos == _bufferSize - 1) + else { FlushWrite(); }