FIX: zip plugin - VMS swap file: use archive dir (with /tmp fallback); unlink on POSIX after open to prevent crash-orphan temp files

This commit is contained in:
heredie 2026-05-22 12:36:18 -06:00
commit 4bac949811
8 changed files with 33 additions and 5 deletions

View file

@ -270,6 +270,7 @@ begin
end
else begin
FTarStream := TAbVirtualMemoryStream.Create;
TAbVirtualMemoryStream(FTarStream).SwapFileDirectory := ExtractFileDir(FArchiveName);
{ Decompress and send to tar LoadArchive }
DecompressToStream(FTarStream);
SwapToTar;

View file

@ -300,6 +300,7 @@ begin
end
else begin
FTarStream := TAbVirtualMemoryStream.Create;
TAbVirtualMemoryStream(FTarStream).SwapFileDirectory := ExtractFileDir(FArchiveName);
{ Decompress and send to tar LoadArchive }
DecompressToStream(FTarStream);
SwapToTar;

View file

@ -1097,6 +1097,7 @@ begin
end
else begin
FTarStream := TAbVirtualMemoryStream.Create;
TAbVirtualMemoryStream(FTarStream).SwapFileDirectory := ExtractFileDir(FArchiveName);
GzHelp.ReadHeader;
repeat
GzHelp.ExtractItemData(FTarStream);

View file

@ -172,6 +172,7 @@ begin
FLzmaStream := FStream;
FLzmaItem := FItemList;
FTarStream := TAbVirtualMemoryStream.Create;
TAbVirtualMemoryStream(FTarStream).SwapFileDirectory := ExtractFileDir(aArchiveName);
FTarList := TAbArchiveList.Create(True);
end;
{ -------------------------------------------------------------------------- }

View file

@ -517,10 +517,21 @@ var
hFile: System.THandle;
TempPath : String;
begin
{ Default to the system temp directory; upgrade to Dir if it exists and is
writable. Using the archive's own directory avoids /tmp tmpfs size limits
when packing large archives. }
TempPath := AbGetTempDirectory;
if mbDirectoryExists(Dir) then
TempPath := IncludeTrailingPathDelimiter(Dir)
else
TempPath := AbGetTempDirectory;
begin
{ Quick writeability probe: try to create and immediately remove a file. }
hFile := mbFileCreate(IncludeTrailingPathDelimiter(Dir) + '~probe');
if hFile <> feInvalidHandle then
begin
FileClose(hFile);
mbDeleteFile(IncludeTrailingPathDelimiter(Dir) + '~probe');
TempPath := IncludeTrailingPathDelimiter(Dir);
end;
end;
Result := GetTempName(TempPath + 'VMS');

View file

@ -435,8 +435,16 @@ begin
if (vmsSwapHandle <= 0) then begin
vmsSwapHandle := 0;
mbDeleteFile(vmsSwapFileName);
raise EAbVMSErrorOpenSwap.Create( vmsSwapFileName );
raise EAbVMSErrorOpenSwap.Create( vmsSwapFileName );
end;
{ On POSIX systems, unlink the file immediately after opening so that
the kernel reclaims disk space automatically if the process crashes
before the destructor runs. The handle remains valid for read/write
until it is closed normally by vmsSwapFileDestroy. }
{$IF DEFINED(UNIX)}
mbDeleteFile(vmsSwapFileName);
vmsSwapFileName := '';
{$ENDIF}
vmsSwapFileSize := 0;
end;
end;
@ -445,7 +453,10 @@ procedure TAbVirtualMemoryStream.vmsSwapFileDestroy;
begin
if (vmsSwapHandle <> 0) then begin
FileClose(vmsSwapHandle);
mbDeleteFile(vmsSwapFileName);
{ On POSIX the file was already unlinked in vmsSwapFileCreate, so
vmsSwapFileName is empty and there is nothing left to delete. }
if (vmsSwapFileName <> '') then
mbDeleteFile(vmsSwapFileName);
vmsSwapHandle := 0;
end;
end;

View file

@ -293,6 +293,7 @@ begin
end
else begin
FTarStream := TAbVirtualMemoryStream.Create;
TAbVirtualMemoryStream(FTarStream).SwapFileDirectory := ExtractFileDir(FArchiveName);
{ Decompress and send to tar LoadArchive }
DecompressToStream(FTarStream);
SwapToTar;

View file

@ -291,6 +291,7 @@ begin
end
else begin
FTarStream := TAbVirtualMemoryStream.Create;
TAbVirtualMemoryStream(FTarStream).SwapFileDirectory := ExtractFileDir(FArchiveName);
{ Decompress and send to tar LoadArchive }
DecompressToStream(FTarStream);
SwapToTar;