From ed99a80951a194cc8f839581d2820f58a284a1cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9rald=20Barr=C3=A9?= Date: Sat, 15 May 2021 13:59:12 -0400 Subject: [PATCH 1/2] Fix FlushAsyncInternal when emitting BOM Update StreamWriter.WriteTests.cs Update StreamWriter.WriteTests.cs --- .../tests/StreamWriter/StreamWriter.WriteTests.cs | 15 +++++++++++++++ .../src/System/IO/StreamWriter.cs | 3 +-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/libraries/System.IO/tests/StreamWriter/StreamWriter.WriteTests.cs b/src/libraries/System.IO/tests/StreamWriter/StreamWriter.WriteTests.cs index 269a756cd040d..c5317953fdb7a 100644 --- a/src/libraries/System.IO/tests/StreamWriter/StreamWriter.WriteTests.cs +++ b/src/libraries/System.IO/tests/StreamWriter/StreamWriter.WriteTests.cs @@ -415,5 +415,20 @@ public void StreamWriter_WithOptionalArguments_NoExceptions() Assert.False(tempStream.CanRead); } } + + [Fact] + public async Task StreamWriter_WriteAsync_EmitBOMAndFlushDataWhenBufferIsFull() + { + Encoding UTF8BOM = new UTF8Encoding(encoderShouldEmitUTF8Identifier: true, throwOnInvalidBytes: true); + + using (var s = new MemoryStream()) + using (var writer = new StreamWriter(s, UTF8BOM, 4)) + { + await writer.WriteAsync("abcdefg"); + await writer.FlushAsync(); + + Assert.Equal(10, s.Length); // BOM (3) + string value (7) + } + } } } diff --git a/src/libraries/System.Private.CoreLib/src/System/IO/StreamWriter.cs b/src/libraries/System.Private.CoreLib/src/System/IO/StreamWriter.cs index ce84fbfe85b7e..a43772dbd2215 100644 --- a/src/libraries/System.Private.CoreLib/src/System/IO/StreamWriter.cs +++ b/src/libraries/System.Private.CoreLib/src/System/IO/StreamWriter.cs @@ -942,8 +942,6 @@ private Task FlushAsyncInternal(bool flushStream, bool flushEncoder, Cancellatio } Task flushTask = Core(flushStream, flushEncoder, cancellationToken); - - _charPos = 0; return flushTask; async Task Core(bool flushStream, bool flushEncoder, CancellationToken cancellationToken) @@ -961,6 +959,7 @@ async Task Core(bool flushStream, bool flushEncoder, CancellationToken cancellat byte[] byteBuffer = _byteBuffer ??= new byte[_encoding.GetMaxByteCount(_charBuffer.Length)]; int count = _encoder.GetBytes(new ReadOnlySpan(_charBuffer, 0, _charPos), byteBuffer, flushEncoder); + _charPos = 0; if (count > 0) { await _stream.WriteAsync(new ReadOnlyMemory(byteBuffer, 0, count), cancellationToken).ConfigureAwait(false); From 85c37865c04812f3da4d2f98ac709385312c1e56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9rald=20Barr=C3=A9?= Date: Mon, 24 May 2021 16:28:10 -0400 Subject: [PATCH 2/2] Remove temporary variable --- .../System.Private.CoreLib/src/System/IO/StreamWriter.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/IO/StreamWriter.cs b/src/libraries/System.Private.CoreLib/src/System/IO/StreamWriter.cs index a43772dbd2215..875211723da6b 100644 --- a/src/libraries/System.Private.CoreLib/src/System/IO/StreamWriter.cs +++ b/src/libraries/System.Private.CoreLib/src/System/IO/StreamWriter.cs @@ -941,8 +941,7 @@ private Task FlushAsyncInternal(bool flushStream, bool flushEncoder, Cancellatio return Task.CompletedTask; } - Task flushTask = Core(flushStream, flushEncoder, cancellationToken); - return flushTask; + return Core(flushStream, flushEncoder, cancellationToken); async Task Core(bool flushStream, bool flushEncoder, CancellationToken cancellationToken) {