Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 11 additions & 16 deletions src/Tasks/sdk-tasks/ExtractArchiveToDirectory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -84,20 +84,17 @@ public override bool Execute()
if (isZipArchive)
{
using var zip = new ZipArchive(File.OpenRead(SourceArchive));
string fullDestDirPath = GetFullDirectoryPathWithSeperator(DestinationDirectory);

foreach (var entry in zip.Entries)
{
if (ShouldExtractItem(entry.FullName))
{
string destinationPath = Path.Combine(DestinationDirectory, entry.FullName);
string destinationFileName = GetFullDirectoryPathWithSeperator(destinationPath);
string fullDestDirPath = GetFullDirectoryPathWithSeperator(DestinationDirectory);
string destinationPath = Path.GetFullPath(Path.Combine(DestinationDirectory, entry.FullName));

CheckDestinationPath(destinationFileName, fullDestDirPath);
CheckDestinationPath(destinationPath, fullDestDirPath);

if (!Directory.Exists(Path.Combine(DestinationDirectory, Path.GetDirectoryName(entry.FullName))))
{
Directory.CreateDirectory(Path.Combine(DestinationDirectory, Path.GetDirectoryName(entry.FullName)));
}
Directory.CreateDirectory(Path.GetDirectoryName(destinationPath));

Log.LogMessage(Path.GetDirectoryName(entry.FullName));
entry.ExtractToFile(destinationPath);
Expand All @@ -116,6 +113,7 @@ public override bool Execute()
using var decompressedStream = new MemoryStream();
decompressor.CopyTo(decompressedStream);
decompressedStream.Seek(0, SeekOrigin.Begin);
string fullDestDirPath = GetFullDirectoryPathWithSeperator(DestinationDirectory);

// Extract Tar content
using TarReader tr = new TarReader(decompressedStream);
Expand All @@ -127,15 +125,12 @@ public override bool Execute()
entryName = entryName.StartsWith("./") ? entryName[2..] : entryName;
if (ShouldExtractItem(entryName))
{
string destinationPath = Path.Combine(DestinationDirectory, entryName);
string destinationFileName = GetFullDirectoryPathWithSeperator(destinationPath);
string fullDestDirPath = GetFullDirectoryPathWithSeperator(DestinationDirectory);
string destinationPath = Path.GetFullPath(Path.Combine(DestinationDirectory, entryName));

CheckDestinationPath(destinationFileName, fullDestDirPath);
CheckDestinationPath(destinationPath, fullDestDirPath);
Directory.CreateDirectory(Path.GetDirectoryName(destinationPath));

Log.LogMessage(entryName);

Directory.CreateDirectory(Path.GetDirectoryName(destinationPath));
tarEntry.ExtractToFile(destinationPath, overwrite: true);
}
}
Expand Down Expand Up @@ -186,7 +181,7 @@ private string GetFullDirectoryPathWithSeperator(string directory)
{
string fullDirectoryPath = Path.GetFullPath(directory);

if (!fullDirectoryPath.EndsWith(Path.DirectorySeparatorChar.ToString(), StringComparison.OrdinalIgnoreCase))
if (!fullDirectoryPath.EndsWith(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal))
{
fullDirectoryPath = string.Concat(fullDirectoryPath, Path.DirectorySeparatorChar);
}
Expand All @@ -196,7 +191,7 @@ private string GetFullDirectoryPathWithSeperator(string directory)

private void CheckDestinationPath(string destinationFileName, string fullDestDirPath)
{
if (!destinationFileName.StartsWith(fullDestDirPath, StringComparison.OrdinalIgnoreCase))
if (!destinationFileName.StartsWith(fullDestDirPath, StringComparison.Ordinal))
{
throw new System.InvalidOperationException("Entry is outside the target dir: " + destinationFileName);
}
Expand Down
Loading