Skip to content

Commit 58b5b52

Browse files
committed
Normalize extraction methods
1 parent 0725f4b commit 58b5b52

File tree

10 files changed

+134
-57
lines changed

10 files changed

+134
-57
lines changed

BinaryObjectScanner/FileType/BZip2.cs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,23 @@ public bool Extract(Stream? stream, string file, string outDir, bool includeDebu
3131
// Try opening the stream
3232
using var bz2File = new BZip2InputStream(stream, true);
3333

34-
// Create the output file path
35-
Directory.CreateDirectory(outDir);
36-
string tempFile = Path.Combine(outDir, Guid.NewGuid().ToString());
34+
// Ensure directory separators are consistent
35+
string filename = Guid.NewGuid().ToString();
36+
if (Path.DirectorySeparatorChar == '\\')
37+
filename = filename.Replace('/', '\\');
38+
else if (Path.DirectorySeparatorChar == '/')
39+
filename = filename.Replace('\\', '/');
40+
41+
// Ensure the full output directory exists
42+
filename = Path.Combine(outDir, filename);
43+
var directoryName = Path.GetDirectoryName(filename);
44+
if (directoryName != null && !Directory.Exists(directoryName))
45+
Directory.CreateDirectory(directoryName);
3746

3847
// Extract the file
39-
using FileStream fs = File.OpenWrite(tempFile);
48+
using FileStream fs = File.OpenWrite(filename);
4049
bz2File.CopyTo(fs);
50+
fs.Flush();
4151

4252
return true;
4353
}

BinaryObjectScanner/FileType/CFB.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,21 @@ public bool Extract(Stream? stream, string file, string outDir, bool includeDebu
6666
decoded = decoded.Replace(c, '_');
6767
}
6868

69-
string tempFile = Path.Combine(outDir, decoded);
70-
var directoryName = Path.GetDirectoryName(tempFile);
69+
// Ensure directory separators are consistent
70+
if (Path.DirectorySeparatorChar == '\\')
71+
decoded = decoded.Replace('/', '\\');
72+
else if (Path.DirectorySeparatorChar == '/')
73+
decoded = decoded.Replace('\\', '/');
74+
75+
// Ensure the full output directory exists
76+
decoded = Path.Combine(outDir, decoded);
77+
var directoryName = Path.GetDirectoryName(decoded);
7178
if (directoryName != null && !Directory.Exists(directoryName))
7279
Directory.CreateDirectory(directoryName);
7380

74-
using Stream fs = File.OpenWrite(tempFile);
81+
using Stream fs = File.OpenWrite(decoded);
7582
fs.Write(strData, 0, strData.Length);
83+
fs.Flush();
7684
}
7785
catch (Exception ex)
7886
{

BinaryObjectScanner/FileType/GZIP.cs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,23 @@ public bool Extract(Stream? stream, string file, string outDir, bool includeDebu
3131
// Try opening the stream
3232
using var gzipFile = new GZipStream(stream, CompressionMode.Decompress, true);
3333

34-
// Create the output file path
35-
Directory.CreateDirectory(outDir);
36-
string tempFile = Path.Combine(outDir, Guid.NewGuid().ToString());
34+
// Ensure directory separators are consistent
35+
string filename = Guid.NewGuid().ToString();
36+
if (Path.DirectorySeparatorChar == '\\')
37+
filename = filename.Replace('/', '\\');
38+
else if (Path.DirectorySeparatorChar == '/')
39+
filename = filename.Replace('\\', '/');
40+
41+
// Ensure the full output directory exists
42+
filename = Path.Combine(outDir, filename);
43+
var directoryName = Path.GetDirectoryName(filename);
44+
if (directoryName != null && !Directory.Exists(directoryName))
45+
Directory.CreateDirectory(directoryName);
3746

3847
// Extract the file
39-
using FileStream fs = File.OpenWrite(tempFile);
48+
using FileStream fs = File.OpenWrite(filename);
4049
gzipFile.CopyTo(fs);
50+
fs.Flush();
4151

4252
return true;
4353
}

BinaryObjectScanner/FileType/InstallShieldCAB.cs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -71,22 +71,20 @@ public bool Extract(Stream? stream, string file, string outDir, bool includeDebu
7171
if (!cabfile.HeaderList.FileIsValid(i))
7272
continue;
7373

74-
string tempFile;
75-
try
76-
{
77-
string? filename = cabfile.HeaderList.GetFileName(i);
78-
tempFile = Path.Combine(outDir, filename ?? string.Empty);
79-
}
80-
catch
81-
{
82-
tempFile = Path.Combine(outDir, $"BAD_FILENAME{i}");
83-
}
74+
// Ensure directory separators are consistent
75+
string filename = cabfile.HeaderList.GetFileName(i) ?? $"BAD_FILENAME{i}";
76+
if (Path.DirectorySeparatorChar == '\\')
77+
filename = filename.Replace('/', '\\');
78+
else if (Path.DirectorySeparatorChar == '/')
79+
filename = filename.Replace('\\', '/');
8480

85-
var directoryName = Path.GetDirectoryName(tempFile);
81+
// Ensure the full output directory exists
82+
filename = Path.Combine(outDir, filename);
83+
var directoryName = Path.GetDirectoryName(filename);
8684
if (directoryName != null && !Directory.Exists(directoryName))
8785
Directory.CreateDirectory(directoryName);
8886

89-
cabfile.FileSave(i, tempFile);
87+
cabfile.FileSave(i, filename);
9088
}
9189
catch (Exception ex)
9290
{

BinaryObjectScanner/FileType/MPQ.cs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,23 @@ public bool Extract(Stream? stream, string file, string outDir, bool includeDebu
5656
// Loop over each entry
5757
foreach (string sub in listfileLines)
5858
{
59+
// Ensure directory separators are consistent
60+
string filename = sub;
61+
if (Path.DirectorySeparatorChar == '\\')
62+
filename = filename.Replace('/', '\\');
63+
else if (Path.DirectorySeparatorChar == '/')
64+
filename = filename.Replace('\\', '/');
65+
66+
// Ensure the full output directory exists
67+
filename = Path.Combine(outDir, filename);
68+
var directoryName = Path.GetDirectoryName(filename);
69+
if (directoryName != null && !Directory.Exists(directoryName))
70+
Directory.CreateDirectory(directoryName);
71+
72+
// Try to write the data
5973
try
6074
{
61-
string tempFile = Path.Combine(outDir, sub);
62-
var directoryName = Path.GetDirectoryName(tempFile);
63-
if (directoryName != null && !Directory.Exists(directoryName))
64-
Directory.CreateDirectory(directoryName);
65-
66-
mpqArchive.ExtractFile(sub, tempFile);
75+
mpqArchive.ExtractFile(sub, filename);
6776
}
6877
catch (System.Exception ex)
6978
{

BinaryObjectScanner/FileType/PKZIP.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,20 @@ public bool Extract(Stream? stream, string file, string outDir, bool lookForHead
6464
if (!entry.IsComplete)
6565
continue;
6666

67-
string tempFile = Path.Combine(outDir, entry.Key);
68-
var directoryName = Path.GetDirectoryName(tempFile);
67+
// Ensure directory separators are consistent
68+
string filename = entry.Key;
69+
if (Path.DirectorySeparatorChar == '\\')
70+
filename = filename.Replace('/', '\\');
71+
else if (Path.DirectorySeparatorChar == '/')
72+
filename = filename.Replace('\\', '/');
73+
74+
// Ensure the full output directory exists
75+
filename = Path.Combine(outDir, filename);
76+
var directoryName = Path.GetDirectoryName(filename);
6977
if (directoryName != null && !Directory.Exists(directoryName))
7078
Directory.CreateDirectory(directoryName);
7179

72-
entry.WriteToFile(tempFile);
80+
entry.WriteToFile(filename);
7381
}
7482
catch (Exception ex)
7583
{

BinaryObjectScanner/FileType/RAR.cs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -67,14 +67,14 @@ public bool Extract(Stream? stream, string file, string outDir, bool lookForHead
6767
return false;
6868
#endif
6969
}
70-
70+
7171
#if NET462_OR_GREATER || NETCOREAPP
72-
72+
7373
/// <summary>
7474
/// Extraction method for non-solid archives. This iterates over each entry in the archive to extract every
7575
/// file individually, in order to extract all valid files from the archive.
7676
/// </summary>
77-
private bool ExtractNonSolid(RarArchive rarFile, string outDir, bool includeDebug)
77+
private static bool ExtractNonSolid(RarArchive rarFile, string outDir, bool includeDebug)
7878
{
7979
foreach (var entry in rarFile.Entries)
8080
{
@@ -92,12 +92,20 @@ private bool ExtractNonSolid(RarArchive rarFile, string outDir, bool includeDebu
9292
if (!entry.IsComplete)
9393
continue;
9494

95-
string tempFile = Path.Combine(outDir, entry.Key);
96-
var directoryName = Path.GetDirectoryName(tempFile);
95+
// Ensure directory separators are consistent
96+
string filename = entry.Key;
97+
if (Path.DirectorySeparatorChar == '\\')
98+
filename = filename.Replace('/', '\\');
99+
else if (Path.DirectorySeparatorChar == '/')
100+
filename = filename.Replace('\\', '/');
101+
102+
// Ensure the full output directory exists
103+
filename = Path.Combine(outDir, filename);
104+
var directoryName = Path.GetDirectoryName(filename);
97105
if (directoryName != null && !Directory.Exists(directoryName))
98106
Directory.CreateDirectory(directoryName);
99107

100-
entry.WriteToFile(tempFile);
108+
entry.WriteToFile(filename);
101109
}
102110
catch (Exception ex)
103111
{
@@ -106,12 +114,12 @@ private bool ExtractNonSolid(RarArchive rarFile, string outDir, bool includeDebu
106114
}
107115
return true;
108116
}
109-
117+
110118
/// <summary>
111119
/// Extraction method for solid archives. Uses ExtractAllEntries because extraction for solid archives must be
112120
/// done sequentially, and files beyond a corrupted point in a solid archive will be unreadable anyways.
113121
/// </summary>
114-
private bool ExtractSolid(RarArchive rarFile, string outDir, bool includeDebug)
122+
private static bool ExtractSolid(RarArchive rarFile, string outDir, bool includeDebug)
115123
{
116124
try
117125
{

BinaryObjectScanner/FileType/SevenZip.cs

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,13 @@ public bool Extract(Stream? stream, string file, string outDir, bool lookForHead
6565
return false;
6666
#endif
6767
}
68-
68+
6969
#if NET462_OR_GREATER || NETCOREAPP
7070
/// <summary>
7171
/// Extraction method for non-solid archives. This iterates over each entry in the archive to extract every
7272
/// file individually, in order to extract all valid files from the archive.
7373
/// </summary>
74-
private bool ExtractNonSolid(SevenZipArchive sevenZip, string outDir, bool includeDebug)
74+
private static bool ExtractNonSolid(SevenZipArchive sevenZip, string outDir, bool includeDebug)
7575
{
7676
foreach (var entry in sevenZip.Entries)
7777
{
@@ -89,12 +89,20 @@ private bool ExtractNonSolid(SevenZipArchive sevenZip, string outDir, bool inclu
8989
if (!entry.IsComplete)
9090
continue;
9191

92-
string tempFile = Path.Combine(outDir, entry.Key);
93-
var directoryName = Path.GetDirectoryName(tempFile);
92+
// Ensure directory separators are consistent
93+
string filename = entry.Key;
94+
if (Path.DirectorySeparatorChar == '\\')
95+
filename = filename.Replace('/', '\\');
96+
else if (Path.DirectorySeparatorChar == '/')
97+
filename = filename.Replace('\\', '/');
98+
99+
// Ensure the full output directory exists
100+
filename = Path.Combine(outDir, filename);
101+
var directoryName = Path.GetDirectoryName(filename);
94102
if (directoryName != null && !Directory.Exists(directoryName))
95103
Directory.CreateDirectory(directoryName);
96104

97-
entry.WriteToFile(tempFile);
105+
entry.WriteToFile(filename);
98106
}
99107
catch (Exception ex)
100108
{
@@ -103,24 +111,24 @@ private bool ExtractNonSolid(SevenZipArchive sevenZip, string outDir, bool inclu
103111
}
104112
return true;
105113
}
106-
114+
107115
/// <summary>
108116
/// Extraction method for solid archives. Uses ExtractAllEntries because extraction for solid archives must be
109117
/// done sequentially, and files beyond a corrupted point in a solid archive will be unreadable anyways.
110118
/// </summary>
111-
private bool ExtractSolid(SevenZipArchive sevenZip, string outDir, bool includeDebug)
119+
private static bool ExtractSolid(SevenZipArchive sevenZip, string outDir, bool includeDebug)
112120
{
113121
try
114122
{
115123
if (!Directory.Exists(outDir))
116124
Directory.CreateDirectory(outDir);
117-
125+
118126
sevenZip.WriteToDirectory(outDir, new ExtractionOptions()
119127
{
120128
ExtractFullPath = true,
121-
Overwrite = true,
129+
Overwrite = true,
122130
});
123-
131+
124132
}
125133
catch (Exception ex)
126134
{

BinaryObjectScanner/FileType/TapeArchive.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,20 @@ public bool Extract(Stream? stream, string file, string outDir, bool includeDebu
5454
if (!entry.IsComplete)
5555
continue;
5656

57-
string tempFile = Path.Combine(outDir, entry.Key);
58-
var directoryName = Path.GetDirectoryName(tempFile);
57+
// Ensure directory separators are consistent
58+
string filename = entry.Key;
59+
if (Path.DirectorySeparatorChar == '\\')
60+
filename = filename.Replace('/', '\\');
61+
else if (Path.DirectorySeparatorChar == '/')
62+
filename = filename.Replace('\\', '/');
63+
64+
// Ensure the full output directory exists
65+
filename = Path.Combine(outDir, filename);
66+
var directoryName = Path.GetDirectoryName(filename);
5967
if (directoryName != null && !Directory.Exists(directoryName))
6068
Directory.CreateDirectory(directoryName);
6169

62-
entry.WriteToFile(tempFile);
70+
entry.WriteToFile(filename);
6371
}
6472
catch (Exception ex)
6573
{

BinaryObjectScanner/FileType/XZ.cs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,23 @@ public bool Extract(Stream? stream, string file, string outDir, bool includeDebu
3434
// Try opening the stream
3535
using var xzFile = new XZStream(stream);
3636

37-
// Create the output file path
38-
Directory.CreateDirectory(outDir);
39-
string tempFile = Path.Combine(outDir, Guid.NewGuid().ToString());
37+
// Ensure directory separators are consistent
38+
string filename = Guid.NewGuid().ToString();
39+
if (Path.DirectorySeparatorChar == '\\')
40+
filename = filename.Replace('/', '\\');
41+
else if (Path.DirectorySeparatorChar == '/')
42+
filename = filename.Replace('\\', '/');
43+
44+
// Ensure the full output directory exists
45+
filename = Path.Combine(outDir, filename);
46+
var directoryName = Path.GetDirectoryName(filename);
47+
if (directoryName != null && !Directory.Exists(directoryName))
48+
Directory.CreateDirectory(directoryName);
4049

4150
// Extract the file
42-
using FileStream fs = File.OpenWrite(tempFile);
51+
using FileStream fs = File.OpenWrite(filename);
4352
xzFile.CopyTo(fs);
53+
fs.Flush();
4454

4555
return true;
4656
}

0 commit comments

Comments
 (0)