Browse Source

#2089: Handle invalid attribute/reference metadata in `DetectTargetFrameworkId`

pull/2113/head
Daniel Grunwald 6 years ago
parent
commit
40e2776f02
  1. 74
      ICSharpCode.Decompiler/Metadata/DotNetCorePathFinderExtensions.cs

74
ICSharpCode.Decompiler/Metadata/DotNetCorePathFinderExtensions.cs

@ -55,44 +55,52 @@ namespace ICSharpCode.Decompiler.Metadata
var reader = assembly.GetMetadataReader(); var reader = assembly.GetMetadataReader();
foreach (var h in reader.GetCustomAttributes(Handle.AssemblyDefinition)) { foreach (var h in reader.GetCustomAttributes(Handle.AssemblyDefinition)) {
var attribute = reader.GetCustomAttribute(h); try {
if (attribute.GetAttributeType(reader).GetFullTypeName(reader).ToString() != TargetFrameworkAttributeName) var attribute = reader.GetCustomAttribute(h);
continue; if (attribute.GetAttributeType(reader).GetFullTypeName(reader).ToString() != TargetFrameworkAttributeName)
var blobReader = reader.GetBlobReader(attribute.Value); continue;
if (blobReader.ReadUInt16() == 0x0001) { var blobReader = reader.GetBlobReader(attribute.Value);
return blobReader.ReadSerializedString(); if (blobReader.ReadUInt16() == 0x0001) {
return blobReader.ReadSerializedString();
}
} catch (BadImageFormatException) {
// ignore malformed attributes
} }
} }
foreach (var h in reader.AssemblyReferences) { foreach (var h in reader.AssemblyReferences) {
var r = reader.GetAssemblyReference(h); try {
if (r.PublicKeyOrToken.IsNil) var r = reader.GetAssemblyReference(h);
continue; if (r.PublicKeyOrToken.IsNil)
string version; continue;
switch (reader.GetString(r.Name)) { string version;
case "netstandard": switch (reader.GetString(r.Name)) {
version = r.Version.ToString(3); case "netstandard":
return $".NETStandard,Version=v{version}"; version = r.Version.ToString(3);
case "System.Runtime": return $".NETStandard,Version=v{version}";
// System.Runtime.dll uses the following scheme: case "System.Runtime":
// 4.2.0 => .NET Core 2.0 // System.Runtime.dll uses the following scheme:
// 4.2.1 => .NET Core 2.1 / 3.0 // 4.2.0 => .NET Core 2.0
// 4.2.2 => .NET Core 3.1 // 4.2.1 => .NET Core 2.1 / 3.0
if (r.Version >= new Version(4, 2, 0)) { // 4.2.2 => .NET Core 3.1
version = "2.0"; if (r.Version >= new Version(4, 2, 0)) {
if (r.Version >= new Version(4, 2, 1)) { version = "2.0";
version = "3.0"; if (r.Version >= new Version(4, 2, 1)) {
version = "3.0";
}
if (r.Version >= new Version(4, 2, 2)) {
version = "3.1";
}
return $".NETCoreApp,Version=v{version}";
} else {
continue;
} }
if (r.Version >= new Version(4, 2, 2)) { case "mscorlib":
version = "3.1"; version = r.Version.ToString(2);
} return $".NETFramework,Version=v{version}";
return $".NETCoreApp,Version=v{version}"; }
} else { } catch (BadImageFormatException) {
continue; // ignore malformed references
}
case "mscorlib":
version = r.Version.ToString(2);
return $".NETFramework,Version=v{version}";
} }
} }

Loading…
Cancel
Save