Browse Source

#1189: Fix exception trying to disassemble a bunch of random bytes.

pull/1198/head
Daniel Grunwald 7 years ago
parent
commit
6360b70ee6
  1. 9
      ICSharpCode.Decompiler/Disassembler/DomExtensions.cs
  2. 65
      ICSharpCode.Decompiler/Disassembler/MethodBodyDisassembler.cs

9
ICSharpCode.Decompiler/Disassembler/DomExtensions.cs

@ -273,9 +273,6 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -273,9 +273,6 @@ namespace ICSharpCode.Decompiler.Disassembler
break;
}
break;
case HandleKind.PropertyDefinition:
case HandleKind.EventDefinition:
throw new NotSupportedException();
case HandleKind.StandaloneSignature:
var standaloneSig = metadata.GetStandaloneSignature((StandaloneSignatureHandle)entity);
switch (standaloneSig.GetKind()) {
@ -292,11 +289,13 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -292,11 +289,13 @@ namespace ICSharpCode.Decompiler.Disassembler
break;
case StandaloneSignatureKind.LocalVariables:
default:
throw new NotSupportedException();
output.Write($"@{MetadataTokens.GetToken(entity):X8} /* signature {standaloneSig.GetKind()} */");
break;
}
break;
default:
throw new NotSupportedException();
output.Write($"@{MetadataTokens.GetToken(entity):X8}");
break;
}
}

65
ICSharpCode.Decompiler/Disassembler/MethodBodyDisassembler.cs

@ -309,14 +309,20 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -309,14 +309,20 @@ namespace ICSharpCode.Decompiler.Disassembler
case OperandType.Sig:
case OperandType.Type:
output.Write(' ');
var handle = MetadataTokens.EntityHandle(blob.ReadInt32());
handle.WriteTo(module, output, genericContext);
WriteMetadataToken(handle, spaceBefore: true);
int metadataToken = blob.ReadInt32();
EntityHandle? handle = TryAsEntityHandle(metadataToken);
try {
handle?.WriteTo(module, output, genericContext);
} catch (BadImageFormatException) {
handle = null;
}
WriteMetadataToken(handle, metadataToken, spaceBefore: true);
break;
case OperandType.Tok:
output.Write(' ');
handle = MetadataTokens.EntityHandle(blob.ReadInt32());
switch (handle.Kind) {
metadataToken = blob.ReadInt32();
handle = TryAsEntityHandle(metadataToken);
switch (handle?.Kind) {
case HandleKind.MemberReference:
switch (metadata.GetMemberReference((MemberReferenceHandle)handle).GetKind()) {
case MemberReferenceKind.Method:
@ -331,8 +337,12 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -331,8 +337,12 @@ namespace ICSharpCode.Decompiler.Disassembler
output.Write("field ");
break;
}
handle.WriteTo(module, output, genericContext);
WriteMetadataToken(handle, spaceBefore: true);
try {
handle?.WriteTo(module, output, genericContext);
} catch (BadImageFormatException) {
handle = null;
}
WriteMetadataToken(handle, metadataToken, spaceBefore: true);
break;
case OperandType.ShortI:
output.Write(' ');
@ -355,10 +365,21 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -355,10 +365,21 @@ namespace ICSharpCode.Decompiler.Disassembler
DisassemblerHelpers.WriteOperand(output, blob.ReadDouble());
break;
case OperandType.String:
var userString = MetadataTokens.UserStringHandle(blob.ReadInt32());
metadataToken = blob.ReadInt32();
output.Write(' ');
DisassemblerHelpers.WriteOperand(output, metadata.GetUserString(userString));
WriteMetadataToken(userString, spaceBefore: true);
UserStringHandle? userString;
string text;
try {
userString = MetadataTokens.UserStringHandle(metadataToken);
text = metadata.GetUserString(userString.Value);
} catch (BadImageFormatException) {
userString = null;
text = null;
}
if (userString != null) {
DisassemblerHelpers.WriteOperand(output, text);
}
WriteMetadataToken(userString, metadataToken, spaceBefore: true);
break;
case OperandType.Switch:
int[] targets = ILParser.DecodeSwitchTargets(ref blob);
@ -405,13 +426,31 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -405,13 +426,31 @@ namespace ICSharpCode.Decompiler.Disassembler
output.WriteLine();
}
private void WriteMetadataToken(Handle handle, bool spaceBefore)
private EntityHandle? TryAsEntityHandle(int metadataToken)
{
// SRM would interpret negative token values as virtual tokens,
// but that causes problems later on.
if (metadataToken < 0)
return null;
try {
return MetadataTokens.EntityHandle(metadataToken);
} catch (ArgumentException) {
return null;
}
}
private void WriteMetadataToken(EntityHandle handle, bool spaceBefore)
{
WriteMetadataToken(handle, MetadataTokens.GetToken(handle), spaceBefore);
}
private void WriteMetadataToken(Handle? handle, int metadataToken, bool spaceBefore)
{
if (ShowMetadataTokens) {
if (ShowMetadataTokens || handle == null) {
if (spaceBefore) {
output.Write(' ');
}
output.Write("/* {0:X8} */", MetadataTokens.GetToken(handle));
output.Write("/* {0:X8} */", metadataToken);
}
}
}

Loading…
Cancel
Save