Skip to content

Commit 008f3c9

Browse files
authored
Cleanup the extraction code based on offline review (#50717)
2 parents e52eadb + e5cec1a commit 008f3c9

File tree

1 file changed

+11
-16
lines changed

1 file changed

+11
-16
lines changed

src/Tasks/sdk-tasks/ExtractArchiveToDirectory.cs

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -84,20 +84,17 @@ public override bool Execute()
8484
if (isZipArchive)
8585
{
8686
using var zip = new ZipArchive(File.OpenRead(SourceArchive));
87+
string fullDestDirPath = GetFullDirectoryPathWithSeperator(DestinationDirectory);
88+
8789
foreach (var entry in zip.Entries)
8890
{
8991
if (ShouldExtractItem(entry.FullName))
9092
{
91-
string destinationPath = Path.Combine(DestinationDirectory, entry.FullName);
92-
string destinationFileName = GetFullDirectoryPathWithSeperator(destinationPath);
93-
string fullDestDirPath = GetFullDirectoryPathWithSeperator(DestinationDirectory);
93+
string destinationPath = Path.GetFullPath(Path.Combine(DestinationDirectory, entry.FullName));
9494

95-
CheckDestinationPath(destinationFileName, fullDestDirPath);
95+
CheckDestinationPath(destinationPath, fullDestDirPath);
9696

97-
if (!Directory.Exists(Path.Combine(DestinationDirectory, Path.GetDirectoryName(entry.FullName))))
98-
{
99-
Directory.CreateDirectory(Path.Combine(DestinationDirectory, Path.GetDirectoryName(entry.FullName)));
100-
}
97+
Directory.CreateDirectory(Path.GetDirectoryName(destinationPath));
10198

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

120118
// Extract Tar content
121119
using TarReader tr = new TarReader(decompressedStream);
@@ -127,15 +125,12 @@ public override bool Execute()
127125
entryName = entryName.StartsWith("./") ? entryName[2..] : entryName;
128126
if (ShouldExtractItem(entryName))
129127
{
130-
string destinationPath = Path.Combine(DestinationDirectory, entryName);
131-
string destinationFileName = GetFullDirectoryPathWithSeperator(destinationPath);
132-
string fullDestDirPath = GetFullDirectoryPathWithSeperator(DestinationDirectory);
128+
string destinationPath = Path.GetFullPath(Path.Combine(DestinationDirectory, entryName));
133129

134-
CheckDestinationPath(destinationFileName, fullDestDirPath);
130+
CheckDestinationPath(destinationPath, fullDestDirPath);
131+
Directory.CreateDirectory(Path.GetDirectoryName(destinationPath));
135132

136133
Log.LogMessage(entryName);
137-
138-
Directory.CreateDirectory(Path.GetDirectoryName(destinationPath));
139134
tarEntry.ExtractToFile(destinationPath, overwrite: true);
140135
}
141136
}
@@ -186,7 +181,7 @@ private string GetFullDirectoryPathWithSeperator(string directory)
186181
{
187182
string fullDirectoryPath = Path.GetFullPath(directory);
188183

189-
if (!fullDirectoryPath.EndsWith(Path.DirectorySeparatorChar.ToString(), StringComparison.OrdinalIgnoreCase))
184+
if (!fullDirectoryPath.EndsWith(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal))
190185
{
191186
fullDirectoryPath = string.Concat(fullDirectoryPath, Path.DirectorySeparatorChar);
192187
}
@@ -196,7 +191,7 @@ private string GetFullDirectoryPathWithSeperator(string directory)
196191

197192
private void CheckDestinationPath(string destinationFileName, string fullDestDirPath)
198193
{
199-
if (!destinationFileName.StartsWith(fullDestDirPath, StringComparison.OrdinalIgnoreCase))
194+
if (!destinationFileName.StartsWith(fullDestDirPath, StringComparison.Ordinal))
200195
{
201196
throw new System.InvalidOperationException("Entry is outside the target dir: " + destinationFileName);
202197
}

0 commit comments

Comments
 (0)