diff --git a/src/CommunityToolkit.HighPerformance/Extensions/IBufferWriterExtensions.cs b/src/CommunityToolkit.HighPerformance/Extensions/IBufferWriterExtensions.cs index 6d659db4..4bdfcc8d 100644 --- a/src/CommunityToolkit.HighPerformance/Extensions/IBufferWriterExtensions.cs +++ b/src/CommunityToolkit.HighPerformance/Extensions/IBufferWriterExtensions.cs @@ -48,10 +48,9 @@ public static Stream AsStream(this IBufferWriter writer) public static unsafe void Write(this IBufferWriter writer, T value) where T : unmanaged { - int length = sizeof(T); - Span span = writer.GetSpan(1); + Span span = writer.GetSpan(sizeof(T)); - if (span.Length < length) + if (span.Length < sizeof(T)) { ThrowArgumentExceptionForEndOfBuffer(); } @@ -60,7 +59,7 @@ public static unsafe void Write(this IBufferWriter writer, T value) Unsafe.WriteUnaligned(ref r0, value); - writer.Advance(length); + writer.Advance(sizeof(T)); } /// diff --git a/tests/CommunityToolkit.HighPerformance.UnitTests/Extensions/Test_IBufferWriterExtensions.cs b/tests/CommunityToolkit.HighPerformance.UnitTests/Extensions/Test_IBufferWriterExtensions.cs index 6ed22de1..696faee7 100644 --- a/tests/CommunityToolkit.HighPerformance.UnitTests/Extensions/Test_IBufferWriterExtensions.cs +++ b/tests/CommunityToolkit.HighPerformance.UnitTests/Extensions/Test_IBufferWriterExtensions.cs @@ -118,4 +118,22 @@ public void Test_IBufferWriterExtensions_WriteReadOverItems_ReadOnlySpan() Assert.IsTrue(span.SequenceEqual(buffer.AsSpan())); } + + // See https://github.com/CommunityToolkit/dotnet/issues/798 + [TestMethod] + public void Test_IBufferWriterExtensions_WriteExceedingFreeCapacity() + { + ArrayPoolBufferWriter writer = new(); + + // Leave only one byte of free capacity + int count = writer.Capacity - 1; + + for (int i = 0; i < count; i++) + { + writer.Write(0); + } + + // Write 4 bytes + writer.Write(1); + } }