From b4a2e2a254d60e617db87d0da6267327ff5cd511 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Tue, 13 Oct 2026 10:34:14 +0100 Subject: [PATCH] Protect earlier ADC and RAR rentals when later allocation fails --- src/SharpCompress/Compressors/ADC/ADCBase.Async.cs | 8 ++++++-- .../Compressors/Rar/UnpackV1/Unpack.Async.cs | 10 +++++++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/SharpCompress/Compressors/ADC/ADCBase.Async.cs b/src/SharpCompress/Compressors/ADC/ADCBase.Async.cs index 7bbbacde..0ce7b30a 100644 --- a/src/SharpCompress/Compressors/ADC/ADCBase.Async.cs +++ b/src/SharpCompress/Compressors/ADC/ADCBase.Async.cs @@ -53,10 +53,11 @@ public static partial class ADCBase var buffer = ArrayPool.Shared.Rent(bufferSize); var outPosition = 0; var full = false; - byte[] temp = ArrayPool.Shared.Rent(3); + byte[]? temp = null; try { + temp = ArrayPool.Shared.Rent(3); while (position < input.Length) { cancellationToken.ThrowIfCancellationRequested(); @@ -170,7 +171,10 @@ public static partial class ADCBase finally { ArrayPool.Shared.Return(buffer); - ArrayPool.Shared.Return(temp); + if (temp is not null) + { + ArrayPool.Shared.Return(temp); + } } } } diff --git a/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack.Async.cs b/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack.Async.cs index 24e9c920..e74ff63f 100644 --- a/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack.Async.cs +++ b/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack.Async.cs @@ -667,11 +667,12 @@ internal sealed partial class Unpack { var bitLengthArray = ArrayPool.Shared.Rent(PackDef.BC); var bitLength = new Memory(bitLengthArray, 0, PackDef.BC); - var tableArray = ArrayPool.Shared.Rent(PackDef.HUFF_TABLE_SIZE); - var table = new Memory(tableArray, 0, PackDef.HUFF_TABLE_SIZE); + byte[]? tableArray = null; try { + tableArray = ArrayPool.Shared.Rent(PackDef.HUFF_TABLE_SIZE); + var table = new Memory(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.Shared.Return(bitLengthArray); - ArrayPool.Shared.Return(tableArray); + if (tableArray is not null) + { + ArrayPool.Shared.Return(tableArray); + } } }