Skip to content

Commit

Permalink
BUGFIX: Check if .net directory exists before using it while preservi…
Browse files Browse the repository at this point in the history
…ng tokens.
  • Loading branch information
Washi1337 committed Aug 19, 2022
1 parent 505da7a commit bf3b6cb
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 2 deletions.
7 changes: 5 additions & 2 deletions src/AsmResolver.DotNet/Builder/Discovery/MemberDiscoverer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,9 @@ public static MemberDiscoveryResult DiscoverMembersInModule(ModuleDefinition mod

private void CollectExistingMembers()
{
if (_module.DotNetDirectory?.Metadata is null)
return;

if ((_flags & MemberDiscoveryFlags.PreserveTypeOrder) != 0)
CollectMembersFromTable<TypeDefinition>(TableIndex.TypeDef);
if ((_flags & MemberDiscoveryFlags.PreserveFieldOrder) != 0)
Expand All @@ -139,8 +142,8 @@ private void CollectMembersFromTable<TMember>(TableIndex tableIndex)
where TMember: IMetadataMember, IModuleProvider
{
// Get original number of elements in the table.
int count = _module.DotNetDirectory!.Metadata
!.GetStream<TablesStream>()
int count = _module.DotNetDirectory!.Metadata!
.GetStream<TablesStream>()
.GetTable(tableIndex)
.Count;

Expand Down
3 changes: 3 additions & 0 deletions src/AsmResolver.DotNet/Builder/DotNetDirectoryFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,9 @@ private void ImportBasicTablesIfSpecified(ModuleDefinition module, DotNetDirecto

private void ImportTypeSpecsAndMemberRefsIfSpecified(ModuleDefinition module, DotNetDirectoryBuffer buffer)
{
if (module.DotNetDirectory is null)
return;

if ((MetadataBuilderFlags & MetadataBuilderFlags.PreserveTypeSpecificationIndices) != 0)
{
ImportTables<TypeSpecification>(module, TableIndex.TypeSpec,
Expand Down
37 changes: 37 additions & 0 deletions test/AsmResolver.DotNet.Tests/Builder/ManagedPEImageBuilderTest.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.IO;
using System.Linq;
using AsmResolver.DotNet.Builder;
using AsmResolver.PE;
using Xunit;

Expand Down Expand Up @@ -42,5 +43,41 @@ public void ExecutableImportDirectoryShouldContainMsCoreeCorDllMain()
relocation.Location.CanRead
&& relocation.Location.CreateReader().ReadUInt32() == image.ImageBase + symbol.AddressTableEntry!.Rva);
}

[Fact]
public void ConstructPEImageFromNewModuleWithNoPreservation()
{
var module = new ModuleDefinition("Module");
var result = module.ToPEImage();
var newModule = ModuleDefinition.FromImage(result);
Assert.Equal(module.Name, newModule.Name);
}

[Fact]
public void ConstructPEImageFromNewModuleWithPreservation()
{
var module = new ModuleDefinition("Module");
var result = module.ToPEImage(new ManagedPEImageBuilder(MetadataBuilderFlags.PreserveAll));
var newModule = ModuleDefinition.FromImage(result);
Assert.Equal(module.Name, newModule.Name);
}

[Fact]
public void ConstructPEImageFromExistingModuleWithNoPreservation()
{
var module = ModuleDefinition.FromBytes(Properties.Resources.HelloWorld);
var result = module.ToPEImage();
var newModule = ModuleDefinition.FromImage(result);
Assert.Equal(module.Name, newModule.Name);
}

[Fact]
public void ConstructPEImageFromExistingModuleWithPreservation()
{
var module = ModuleDefinition.FromBytes(Properties.Resources.HelloWorld);
var result = module.ToPEImage(new ManagedPEImageBuilder(MetadataBuilderFlags.PreserveAll));
var newModule = ModuleDefinition.FromImage(result);
Assert.Equal(module.Name, newModule.Name);
}
}
}

0 comments on commit bf3b6cb

Please sign in to comment.