diff --git a/src/SharpCompress/Archives/Rar/RarArchive.cs b/src/SharpCompress/Archives/Rar/RarArchive.cs index a05ad417..b9c1bfde 100644 --- a/src/SharpCompress/Archives/Rar/RarArchive.cs +++ b/src/SharpCompress/Archives/Rar/RarArchive.cs @@ -14,8 +14,8 @@ namespace SharpCompress.Archives.Rar; public class RarArchive : AbstractArchive { - internal Lazy UnpackV2017 { get; } = - new(() => new Compressors.Rar.UnpackV2017.Unpack()); + private bool _disposed; + internal Lazy UnpackV2017 { get; } = new(() => new Compressors.Rar.UnpackV2017.Unpack()); internal Lazy UnpackV1 { get; } = new(() => new Compressors.Rar.UnpackV1.Unpack()); /// @@ -25,6 +25,20 @@ public class RarArchive : AbstractArchive private RarArchive(SourceStream sourceStream) : base(ArchiveType.Rar, sourceStream) { } + public override void Dispose() + { + if (!_disposed) + { + if (UnpackV1.IsValueCreated && UnpackV1.Value is IDisposable unpackV1) + { + unpackV1.Dispose(); + } + + _disposed = true; + base.Dispose(); + } + } + protected override IEnumerable LoadEntries(IEnumerable volumes) => RarArchiveEntryFactory.GetEntries(this, volumes, ReaderOptions); diff --git a/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack.cs b/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack.cs index e6d4153d..e9891d99 100644 --- a/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack.cs +++ b/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack.cs @@ -1,6 +1,7 @@ #nullable disable using System; +using System.Buffers; using System.Collections.Generic; using System.IO; using SharpCompress.Common; @@ -12,14 +13,27 @@ using SharpCompress.Compressors.Rar.VM; namespace SharpCompress.Compressors.Rar.UnpackV1; -internal sealed partial class Unpack : BitInput, IRarUnpack +internal sealed partial class Unpack : BitInput, IRarUnpack, IDisposable { private readonly BitInput Inp; + private bool disposed; public Unpack() => // to ease in porting Unpack50.cs Inp = this; + public void Dispose() + { + if (!disposed) + { + if (!externalWindow) + { + ArrayPool.Shared.Return(window); + } + disposed = true; + } + } + public bool FileExtracted { get; private set; } public long DestSize @@ -74,7 +88,7 @@ internal sealed partial class Unpack : BitInput, IRarUnpack private BlockTypes unpBlockType; - //private bool externalWindow; + private bool externalWindow; private long writtenFileSize; @@ -113,13 +127,12 @@ internal sealed partial class Unpack : BitInput, IRarUnpack { if (window is null) { - this.window = new byte[PackDef.MAXWINSIZE]; + this.window = ArrayPool.Shared.Rent(PackDef.MAXWINSIZE); } else { this.window = window; - - //externalWindow = true; + externalWindow = true; } inAddr = 0; UnpInitData(false); diff --git a/src/SharpCompress/Readers/AbstractReader.cs b/src/SharpCompress/Readers/AbstractReader.cs index b36acd53..96ac0a58 100644 --- a/src/SharpCompress/Readers/AbstractReader.cs +++ b/src/SharpCompress/Readers/AbstractReader.cs @@ -44,7 +44,7 @@ public abstract class AbstractReader : IReader, IReaderExtracti #region IDisposable Members - public void Dispose() + public virtual void Dispose() { _entriesForCurrentReadStream?.Dispose(); Volume?.Dispose(); diff --git a/src/SharpCompress/Readers/Rar/RarReader.cs b/src/SharpCompress/Readers/Rar/RarReader.cs index 2398cfac..a9078cae 100644 --- a/src/SharpCompress/Readers/Rar/RarReader.cs +++ b/src/SharpCompress/Readers/Rar/RarReader.cs @@ -13,14 +13,28 @@ namespace SharpCompress.Readers.Rar; /// public abstract class RarReader : AbstractReader { + private bool _disposed; private RarVolume? volume; - private Lazy UnpackV2017 { get; } = - new(() => new Compressors.Rar.UnpackV2017.Unpack()); + private Lazy UnpackV2017 { get; } = new(() => new Compressors.Rar.UnpackV2017.Unpack()); private Lazy UnpackV1 { get; } = new(() => new Compressors.Rar.UnpackV1.Unpack()); internal RarReader(ReaderOptions options) : base(options, ArchiveType.Rar) { } + public override void Dispose() + { + if (!_disposed) + { + if (UnpackV1.IsValueCreated && UnpackV1.Value is IDisposable unpackV1) + { + unpackV1.Dispose(); + } + + _disposed = true; + base.Dispose(); + } + } + protected abstract void ValidateArchive(RarVolume archive); public override RarVolume? Volume => volume;