Skip to content

Commit 19e3623

Browse files
committed
check bitwise for unmanaged dlls
1 parent 511eb75 commit 19e3623

File tree

2 files changed

+60
-2
lines changed

2 files changed

+60
-2
lines changed

src/VirtoCommerce.Platform.Modules/Local/LocalStorageModuleCatalog.cs

+59-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Diagnostics;
44
using System.IO;
55
using System.Linq;
6+
using System.Reflection;
67
using Microsoft.Extensions.Logging;
78
using Microsoft.Extensions.Options;
89
using VirtoCommerce.Platform.Core.Common;
@@ -151,7 +152,7 @@ public override void Validate()
151152
.ToArray();
152153
if (installedIncompatibilities.Any())
153154
{
154-
module.Errors.Add($"{ module } is incompatible with installed { string.Join(", ", installedIncompatibilities.Select(x => x.ToString())) }. You should uninstall these modules first.");
155+
module.Errors.Add($"{module} is incompatible with installed {string.Join(", ", installedIncompatibilities.Select(x => x.ToString()))}. You should uninstall these modules first.");
155156
}
156157
}
157158

@@ -284,7 +285,11 @@ private void CopyFile(string sourceFilePath, string targetFilePath)
284285
}
285286

286287
var versionsAreSameButLaterDate = (sourceVersion == targetVersion && targetFileInfo.Exists && sourceFileInfo.Exists && targetFileInfo.LastWriteTimeUtc < sourceFileInfo.LastWriteTimeUtc);
287-
if (!targetFileInfo.Exists || sourceVersion > targetVersion || versionsAreSameButLaterDate)
288+
289+
var correspondBitwise = !targetFileInfo.Exists || !sourceVersion.Equals(targetVersion)
290+
|| ReplaceBitwiseReason(sourceFilePath, targetFilePath);
291+
292+
if (!targetFileInfo.Exists || sourceVersion > targetVersion || versionsAreSameButLaterDate || correspondBitwise)
288293
{
289294
var targetDirectoryPath = Path.GetDirectoryName(targetFilePath);
290295
Directory.CreateDirectory(targetDirectoryPath);
@@ -309,6 +314,58 @@ private void CopyFile(string sourceFilePath, string targetFilePath)
309314
}
310315
}
311316

317+
private bool ReplaceBitwiseReason(string sourceFilePath, string targetFilePath)
318+
{
319+
if (IsManagedLibrary(targetFilePath))
320+
{
321+
return false;
322+
}
323+
324+
var currentIs64 = Environment.Is64BitProcess;
325+
var targetIs64 = !Is32Bitwise(targetFilePath);
326+
327+
if (currentIs64 == targetIs64)
328+
{
329+
return false;
330+
}
331+
332+
var sourceIs64 = !Is32Bitwise(sourceFilePath);
333+
if (currentIs64 == sourceIs64)
334+
{
335+
return true;
336+
}
337+
338+
return false;
339+
}
340+
341+
private bool IsManagedLibrary(string pathToDll)
342+
{
343+
try
344+
{
345+
AssemblyName.GetAssemblyName(pathToDll);
346+
return true;
347+
}
348+
catch
349+
{
350+
// file is unmanaged
351+
}
352+
353+
return false;
354+
}
355+
356+
private bool Is32Bitwise(string dllPath)
357+
{
358+
using var fs = new FileStream(dllPath, FileMode.Open, FileAccess.Read);
359+
using var br = new BinaryReader(fs);
360+
fs.Seek(0x3c, SeekOrigin.Begin);
361+
var peOffset = br.ReadInt32();
362+
363+
fs.Seek(peOffset, SeekOrigin.Begin);
364+
var peHead = br.ReadUInt32();
365+
366+
return peHead == 0x00004550 && br.ReadUInt16() == 0x14c;
367+
}
368+
312369
private bool IsAssemblyRelatedFile(string path)
313370
{
314371
return _options.AssemblyFileExtensions.Union(_options.AssemblyServiceFileExtensions).Any(x => path.EndsWith(x, StringComparison.OrdinalIgnoreCase));

src/VirtoCommerce.Platform.Web/VirtoCommerce.Platform.Web.csproj

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
1010
<DockerfileContext>..\..</DockerfileContext>
1111
<UserSecretsId>local</UserSecretsId>
12+
<PlatformTarget>x86</PlatformTarget>
1213
</PropertyGroup>
1314
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
1415
<NoWarn>1701;1702;1705;1591</NoWarn>

0 commit comments

Comments
 (0)