FIX: zip plugin - prevent crash on TAR abort inside GZip archive

When TAbUserAbort propagates out of TAbTarArchive.SaveArchive (e.g.
from the abort check added to the save loop), it exits the IsGzippedTar
branch of TAbGzipArchive.SaveArchive without calling SwapToGzip. The
outer finally block then compares FStream (which equals FTarStream,
possibly nil) with NewStream (FGzStream) and incorrectly frees
NewStream. The destructor later calls SwapToGzip (restoring FStream to
the already-freed FGzStream) and then frees FStream a second time,
causing an access violation.

Fix: compare FGzStream instead of FStream in the finally condition.
FGzStream always holds the original gzip stream reference and is never
changed by SwapToTar/SwapToGzip, so the NewStream ownership check is
correct regardless of which swap state the archive is in.
This commit is contained in:
heredie 2026-05-21 20:08:39 -06:00
commit ec78eaed7c

View file

@ -1302,7 +1302,10 @@ begin
DoArchiveProgress( 100, Abort );
finally {NewStream}
OutGzHelp.Free;
if (FStream <> NewStream) then
{ Use FGzStream (not FStream) so the comparison is correct even when
SwapToTar was called and an exception prevented SwapToGzip from running.
FGzStream always holds the original gzip stream reference. }
if (FGzStream <> NewStream) then
NewStream.Free;
end;
end;