Repro:
using System.Data.SqlTypes;
var stream = new TrickleStream(new byte[] { 1, 2, 3, 4, 5 });
var bytes = new SqlBytes(stream);
Console.WriteLine(BitConverter.ToString(bytes.Buffer));
class TrickleStream : MemoryStream
{
public TrickleStream(byte[] bytes) : base(bytes) { }
public override int Read(byte[] buffer, int offset, int count) =>
base.Read(buffer, offset, Math.Min(count, 1));
public override int Read(Span<byte> buffer) =>
base.Read(buffer.IsEmpty ? buffer : buffer.Slice(0, 1));
}
That should output:
but ends up outputting:
The Stream.Read operations SqlBytes performs assumes Read will always read as much as was requested, which isn't guaranteed:
|
_stream.Read(buffer, 0, checked((int)_stream.Length)); |
|
_stream.Read(buffer, offsetInBuffer, count); |
|
_stream.Read(_rgbBuf, 0, (int)lStreamLen); |
cc: @roji, @eerhardt
Repro:
That should output:
but ends up outputting:
The Stream.Read operations SqlBytes performs assumes Read will always read as much as was requested, which isn't guaranteed:
runtime/src/libraries/System.Data.Common/src/System/Data/SQLTypes/SQLBytes.cs
Line 182 in 5a10aa6
runtime/src/libraries/System.Data.Common/src/System/Data/SQLTypes/SQLBytes.cs
Line 322 in 5a10aa6
runtime/src/libraries/System.Data.Common/src/System/Data/SQLTypes/SQLBytes.cs
Line 459 in 5a10aa6
cc: @roji, @eerhardt