Skip to content
Open
Show file tree
Hide file tree
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
16 changes: 16 additions & 0 deletions ICSharpCode.ILSpyX/Metadata/PdbDumper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Reflection.PortableExecutable;
using System.Linq;
using System.Text;
using System.Text.Json;
Expand Down Expand Up @@ -116,6 +117,13 @@ internal static ReaderParameters CreateReaderParameters(string? pdbFileName)

static ModuleDefinition ReadModuleWithSymbols(string assemblyFileName, string? pdbFileName)
{
using (var stream = File.OpenRead(assemblyFileName))
using (var reader = new PEReader(stream))
{
if (reader.ReadDebugDirectory().Any(e => e.Type == DebugDirectoryEntryType.EmbeddedPortablePdb
&& DebugInfoUtils.IsEmbeddedPortablePdbTooLarge(reader, e)))
throw new NoDebugSymbolsException($"Embedded Portable PDB is too large for '{assemblyFileName}'.");
}
var parameters = CreateReaderParameters(pdbFileName);
ModuleDefinition module;
try
Expand All @@ -137,6 +145,14 @@ static ModuleDefinition ReadModuleWithSymbols(string assemblyFileName, string? p

static ModuleDefinition ReadModuleWithSymbols(Stream assemblyStream, string assemblyName, string? pdbFileName)
{
long position = assemblyStream.Position;
using (var reader = new PEReader(assemblyStream, PEStreamOptions.LeaveOpen))
{
if (reader.ReadDebugDirectory().Any(e => e.Type == DebugDirectoryEntryType.EmbeddedPortablePdb
&& DebugInfoUtils.IsEmbeddedPortablePdbTooLarge(reader, e)))
throw new NoDebugSymbolsException($"Embedded Portable PDB is too large for '{assemblyName}'.");
}
assemblyStream.Position = position;
var parameters = new ReaderParameters { ReadSymbols = true, InMemory = true };
ApplyExplicitSymbolFile(parameters, pdbFileName);
ModuleDefinition module;
Expand Down
21 changes: 21 additions & 0 deletions ICSharpCode.ILSpyX/PdbProvider/DebugInfoUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
// DEALINGS IN THE SOFTWARE.

using System;
using System.Buffers.Binary;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Reflection.Metadata;
Expand All @@ -32,6 +33,23 @@ namespace ICSharpCode.ILSpyX.PdbProvider
{
public static class DebugInfoUtils
{
internal const int MaxEmbeddedPortablePdbSize = 128 * 1024 * 1024;

public static bool IsEmbeddedPortablePdbTooLarge(PEReader reader, DebugDirectoryEntry entry)
{
if (entry.DataSize < 8)
return false;
try
{
int offset = reader.IsLoadedImage ? entry.DataRelativeVirtualAddress : entry.DataPointer;
var data = reader.GetEntireImage().GetContent(offset, 8);
return BinaryPrimitives.ReadUInt32LittleEndian(data.AsSpan().Slice(4, 4)) > MaxEmbeddedPortablePdbSize;
}
catch (ArgumentOutOfRangeException)
{
return false;
}
}
public static IDebugInfoProvider? LoadSymbols(PEFile module)
{
try
Expand Down Expand Up @@ -131,6 +149,9 @@ static bool TryOpenPortablePdb(PEFile module,
{
if (entry.IsPortableCodeView)
{
if (entry.Type == DebugDirectoryEntryType.EmbeddedPortablePdb
&& IsEmbeddedPortablePdbTooLarge(reader, entry))
return false;
return reader.TryOpenAssociatedPortablePdb(module.FileName, OpenStream,
out provider, out pdbFileName);
}
Expand Down
3 changes: 3 additions & 0 deletions ILSpy/Metadata/DebugDirectoryTreeNode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
using System.Reflection.PortableExecutable;

using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.ILSpyX.PdbProvider;

using ICSharpCode.ILSpy.TreeNodes;
using ICSharpCode.ILSpy.ViewModels;
Expand Down Expand Up @@ -104,6 +105,8 @@ protected override void LoadChildren()
case DebugDirectoryEntryType.EmbeddedPortablePdb:
try
{
if (DebugInfoUtils.IsEmbeddedPortablePdbTooLarge(module.Reader, entry))
break;
var provider = module.Reader.ReadEmbeddedPortablePdbDebugDirectoryData(entry);
var pdbMetadata = new MetadataFile(
MetadataFile.MetadataFileKind.ProgramDebugDatabase,
Expand Down
Loading