Skip to content

Commit c4cac6e

Browse files
committed
Fix Compress buffer size
1 parent bcda43b commit c4cac6e

1 file changed

Lines changed: 10 additions & 9 deletions

File tree

src/MemoryPack.Core/Compression/BrotliCompressor.cs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -206,15 +206,17 @@ public void CopyTo<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> memoryPack
206206
var encoder = new BrotliEncoder(quality, window);
207207
try
208208
{
209-
var writtenNotAdvanced = 0;
209+
var bytesWritten = 0;
210210
foreach (var item in bufferWriter)
211211
{
212-
writtenNotAdvanced = CompressCore(ref encoder, item.Span, ref memoryPackWriter, initialLength: null, isFinalBlock: false);
212+
var span = item.Span;
213+
if (span.Length <= 0) continue;
214+
bytesWritten += CompressCore(ref encoder, item.Span, ref memoryPackWriter, initialLength: null, isFinalBlock: false);
213215
}
214216

215217
// call BrotliEncoderOperation.Finish
216-
var finalBlockLength = (writtenNotAdvanced == 0) ? null : (int?)(writtenNotAdvanced + 10);
217-
CompressCore(ref encoder, ReadOnlySpan<byte>.Empty, ref memoryPackWriter, initialLength: finalBlockLength, isFinalBlock: true);
218+
var finalBlockMaxLength = BrotliUtils.BrotliEncoderMaxCompressedSize(bytesWritten) - bytesWritten;
219+
CompressCore(ref encoder, ReadOnlySpan<byte>.Empty, ref memoryPackWriter, initialLength: finalBlockMaxLength, isFinalBlock: true);
218220
}
219221
finally
220222
{
@@ -257,30 +259,29 @@ static int CompressCore<TBufferWriter>(ref BrotliEncoder encoder, ReadOnlySpan<b
257259
where TBufferWriter : class, IBufferWriter<byte>
258260
#endif
259261
{
260-
var writtenNotAdvanced = 0;
262+
var totalWritten = 0;
261263

262264
var lastResult = OperationStatus.DestinationTooSmall;
263265
while (lastResult == OperationStatus.DestinationTooSmall)
264266
{
265-
ref var spanRef = ref destBufferWriter.GetSpanReference(Math.Max(initialLength ?? source.Length, 1));
267+
ref var spanRef = ref destBufferWriter.GetSpanReference(initialLength ?? source.Length);
266268
var dest = MemoryMarshal.CreateSpan(ref spanRef, destBufferWriter.BufferLength);
267269

268270
lastResult = encoder.Compress(source, dest, out int bytesConsumed, out int bytesWritten, isFinalBlock: isFinalBlock);
269-
writtenNotAdvanced += bytesConsumed;
271+
totalWritten += bytesWritten;
270272

271273
if (lastResult == OperationStatus.InvalidData) MemoryPackSerializationException.ThrowCompressionFailed();
272274
if (bytesWritten > 0)
273275
{
274276
destBufferWriter.Advance(bytesWritten);
275-
writtenNotAdvanced = 0;
276277
}
277278
if (bytesConsumed > 0)
278279
{
279280
source = source.Slice(bytesConsumed);
280281
}
281282
}
282283

283-
return writtenNotAdvanced;
284+
return totalWritten;
284285
}
285286

286287
public void Dispose()

0 commit comments

Comments
 (0)