Skip to content

Commit 80cebb4

Browse files
committed
SpanReader带扩展流读取时,不要超过最大容量,否则可能读取到下一个数据帧的数据
1 parent cef1b1c commit 80cebb4

File tree

2 files changed

+18
-14
lines changed

2 files changed

+18
-14
lines changed

NewLife.Core/Buffers/SpanReader.cs

+17-12
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@ public SpanReader(Stream stream, IPacket? data = null, Int32 bufferSize = 8192)
8888
public void Advance(Int32 count)
8989
{
9090
if (count < 0) throw new ArgumentOutOfRangeException(nameof(count));
91+
92+
if (count > 0) EnsureSpace(count);
93+
9194
if (_index + count > _span.Length) throw new ArgumentOutOfRangeException(nameof(count));
9295

9396
_index += count;
@@ -118,8 +121,11 @@ public void EnsureSpace(Int32 size)
118121
// 申请指定大小的数据包缓冲区,至少达到缓冲区大小,但不超过最大容量
119122
var idx = 0;
120123
var bsize = size;
121-
if (bsize < _bufferSize) bsize = _bufferSize;
122-
if (MaxCapacity > 0 && bsize > MaxCapacity - _total) bsize = MaxCapacity - _total;
124+
if (MaxCapacity > 0)
125+
{
126+
if (bsize < _bufferSize) bsize = _bufferSize;
127+
if (bsize > MaxCapacity - _total) bsize = MaxCapacity - _total;
128+
}
123129
var pk = new OwnerPacket(bsize);
124130
if (_data != null && remain > 0)
125131
{
@@ -133,17 +139,16 @@ public void EnsureSpace(Int32 size)
133139
_data = pk;
134140
_index = 0;
135141

136-
// 多次读取,直到满足需求
137-
//var n = _stream.ReadExactly(pk.Buffer, pk.Offset + idx, pk.Length - idx);
138-
while (idx < size)
139-
{
140-
// 实际缓冲区大小可能大于申请大小,充分利用缓冲区,避免多次读取
141-
var len = pk.Buffer.Length - pk.Offset;
142-
var n = _stream.Read(pk.Buffer, pk.Offset + idx, len - idx);
143-
if (n <= 0) break;
142+
// 多次读取,直到满足需求。不要超过最大容量,否则可能读取到下一个数据帧的数据
143+
_stream.ReadExactly(pk.Buffer, pk.Offset + idx, pk.Length - idx);
144+
idx = pk.Length;
145+
//while (idx < size)
146+
//{
147+
// var n = _stream.Read(pk.Buffer, pk.Offset + idx, pk.Length - idx);
148+
// if (n <= 0) break;
144149

145-
idx += n;
146-
}
150+
// idx += n;
151+
//}
147152
if (idx < size)
148153
throw new InvalidOperationException("Not enough data to read.");
149154
pk.Resize(idx);

NewLife.Core/IO/IOHelper.cs

+1-2
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,6 @@ public static Int32 Write(this Byte[] dst, Int32 dstOffset, Byte[] src, Int32 sr
255255
#endregion
256256

257257
#region 数据流转换
258-
#if !NET7_0_OR_GREATER
259258
/// <summary>从流中完全读取数据,直到指定大小或者到达流结束</summary>
260259
/// <remarks>
261260
/// 主要为了对抗net6开始对Stream.Read的微调。
@@ -275,12 +274,12 @@ public static Int32 ReadExactly(this Stream stream, Byte[] buffer, Int32 offset,
275274
{
276275
var bytesRead = stream.Read(buffer, offset + totalRead, count - totalRead);
277276
if (bytesRead == 0) break;
277+
278278
totalRead += bytesRead;
279279
}
280280

281281
return totalRead;
282282
}
283-
#endif
284283

285284
/// <summary>数据流转为字节数组</summary>
286285
/// <remarks>

0 commit comments

Comments
 (0)