mirror of
https://github.com/doublecmd/doublecmd.git
synced 2026-06-21 09:58:13 +00:00
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:
parent
d0140b8834
commit
4bac949811
8 changed files with 33 additions and 5 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -1097,6 +1097,7 @@ begin
|
|||
end
|
||||
else begin
|
||||
FTarStream := TAbVirtualMemoryStream.Create;
|
||||
TAbVirtualMemoryStream(FTarStream).SwapFileDirectory := ExtractFileDir(FArchiveName);
|
||||
GzHelp.ReadHeader;
|
||||
repeat
|
||||
GzHelp.ExtractItemData(FTarStream);
|
||||
|
|
|
|||
|
|
@ -172,6 +172,7 @@ begin
|
|||
FLzmaStream := FStream;
|
||||
FLzmaItem := FItemList;
|
||||
FTarStream := TAbVirtualMemoryStream.Create;
|
||||
TAbVirtualMemoryStream(FTarStream).SwapFileDirectory := ExtractFileDir(aArchiveName);
|
||||
FTarList := TAbArchiveList.Create(True);
|
||||
end;
|
||||
{ -------------------------------------------------------------------------- }
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue