From fe7e316024623faf6d41611b7a8d2d6c37889422 Mon Sep 17 00:00:00 2001 From: CyrusNajmabadi Date: Tue, 17 May 2016 16:08:43 -0700 Subject: [PATCH] Be resilient to when we get an exception while reading metadata. --- .../PortableExecutableReference.cs | 3 +++ .../SymbolTree/SymbolTreeInfo_Metadata.cs | 17 +++++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/Compilers/Core/Portable/MetadataReference/PortableExecutableReference.cs b/src/Compilers/Core/Portable/MetadataReference/PortableExecutableReference.cs index b5e1c8f704e..195e2066b76 100644 --- a/src/Compilers/Core/Portable/MetadataReference/PortableExecutableReference.cs +++ b/src/Compilers/Core/Portable/MetadataReference/PortableExecutableReference.cs @@ -162,6 +162,9 @@ internal Metadata GetMetadataNoCopy() /// Returns a copy of the object this /// contains. This copy does not need to be d. /// + /// If the PE image format is invalid. + /// The metadata image content can't be read. + /// The metadata image is stored in a file that can't be found. public Metadata GetMetadata() { return GetMetadataNoCopy().Copy(); diff --git a/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo_Metadata.cs b/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo_Metadata.cs index 4f182b14d43..529e465dce7 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo_Metadata.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo_Metadata.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Reflection; using System.Reflection.Metadata; @@ -13,6 +14,18 @@ namespace Microsoft.CodeAnalysis.FindSymbols { internal partial class SymbolTreeInfo { + private static Metadata GetMetadataNoThrow(PortableExecutableReference reference) + { + try + { + return reference.GetMetadata(); + } + catch (Exception e) when (e is BadImageFormatException || e is IOException) + { + return null; + } + } + /// /// this gives you SymbolTreeInfo for a metadata /// @@ -22,7 +35,7 @@ internal partial class SymbolTreeInfo bool loadOnly, CancellationToken cancellationToken) { - var metadata = reference.GetMetadata(); + var metadata = GetMetadataNoThrow(reference); if (metadata == null) { return null; @@ -76,7 +89,7 @@ internal partial class SymbolTreeInfo { var unsortedNodes = new List { new Node("", Node.RootNodeParentIndex) }; - foreach (var moduleMetadata in GetModuleMetadata(reference.GetMetadata())) + foreach (var moduleMetadata in GetModuleMetadata(GetMetadataNoThrow(reference))) { MetadataReader reader; try -- GitLab