Protect earlier ADC and RAR rentals when later allocation fails

This commit is contained in:
Adam Hathcock
2026-10-13 10:34:14 +01:00
parent b91671dfc3
commit b4a2e2a254
2 changed files with 13 additions and 5 deletions

View File

@@ -53,10 +53,11 @@ public static partial class ADCBase
var buffer = ArrayPool<byte>.Shared.Rent(bufferSize);
var outPosition = 0;
var full = false;
byte[] temp = ArrayPool<byte>.Shared.Rent(3);
byte[]? temp = null;
try
{
temp = ArrayPool<byte>.Shared.Rent(3);
while (position < input.Length)
{
cancellationToken.ThrowIfCancellationRequested();
@@ -170,7 +171,10 @@ public static partial class ADCBase
finally
{
ArrayPool<byte>.Shared.Return(buffer);
ArrayPool<byte>.Shared.Return(temp);
if (temp is not null)
{
ArrayPool<byte>.Shared.Return(temp);
}
}
}
}

View File

@@ -667,11 +667,12 @@ internal sealed partial class Unpack
{
var bitLengthArray = ArrayPool<byte>.Shared.Rent(PackDef.BC);
var bitLength = new Memory<byte>(bitLengthArray, 0, PackDef.BC);
var tableArray = ArrayPool<byte>.Shared.Rent(PackDef.HUFF_TABLE_SIZE);
var table = new Memory<byte>(tableArray, 0, PackDef.HUFF_TABLE_SIZE);
byte[]? tableArray = null;
try
{
tableArray = ArrayPool<byte>.Shared.Rent(PackDef.HUFF_TABLE_SIZE);
var table = new Memory<byte>(tableArray, 0, PackDef.HUFF_TABLE_SIZE);
if (inAddr > readTop - 25)
{
if (!await unpReadBufAsync(cancellationToken).ConfigureAwait(false))
@@ -813,7 +814,10 @@ internal sealed partial class Unpack
finally
{
ArrayPool<byte>.Shared.Return(bitLengthArray);
ArrayPool<byte>.Shared.Return(tableArray);
if (tableArray is not null)
{
ArrayPool<byte>.Shared.Return(tableArray);
}
}
}