Browse Source

Fix #1234: handle exception when a field initial value is not available

pull/1243/head
Daniel Grunwald 7 years ago
parent
commit
b331c59169
  1. 9
      ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs
  2. 2
      ICSharpCode.Decompiler/Metadata/Dom.cs
  3. 11
      ICSharpCode.Decompiler/SRMExtensions.cs

9
ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs

@ -1199,8 +1199,13 @@ namespace ICSharpCode.Decompiler.CSharp
// Field data as specified in II.16.3.2 of ECMA-335 6th edition:
// .data I_X = int32(123)
// .field public static int32 _x at I_X
var initVal = fieldDefinition.GetInitialValue(module.PEFile.Reader, TypeSystem);
var message = string.Format(" Not supported: data({0}) ", BitConverter.ToString(initVal.ReadBytes(initVal.RemainingBytes)).Replace('-', ' '));
string message;
try {
var initVal = fieldDefinition.GetInitialValue(module.PEFile.Reader, TypeSystem);
message = string.Format(" Not supported: data({0}) ", BitConverter.ToString(initVal.ReadBytes(initVal.RemainingBytes)).Replace('-', ' '));
} catch (BadImageFormatException ex) {
message = ex.Message;
}
((FieldDeclaration)fieldDecl).Variables.Single().AddChild(new Comment(message, CommentType.MultiLine), Roles.Comment);
}
return fieldDecl;

2
ICSharpCode.Decompiler/Metadata/Dom.cs

@ -92,6 +92,8 @@ namespace ICSharpCode.Decompiler.Metadata
var reader = sectionData.GetReader();
reader.Offset += (int)This().Offset;
int length = reader.ReadInt32();
if (length < 0 || length > reader.RemainingBytes)
throw new BadImageFormatException("Resource stream length invalid");
return new ResourceMemoryStream(Module.Reader, reader.CurrentPointer, length);
}
}

11
ICSharpCode.Decompiler/SRMExtensions.cs

@ -337,11 +337,18 @@ namespace ICSharpCode.Decompiler
public static unsafe SRM.BlobReader GetInitialValue(this FieldDefinition field, PEReader pefile, ICompilation typeSystem)
{
if (!field.HasFlag(FieldAttributes.HasFieldRVA) || field.GetRelativeVirtualAddress() == 0)
if (!field.HasFlag(FieldAttributes.HasFieldRVA))
return default;
int rva = field.GetRelativeVirtualAddress();
if (rva == 0)
return default;
int size = field.DecodeSignature(new FieldValueSizeDecoder(typeSystem), default);
return pefile.GetSectionData(rva).GetReader(0, size);
var sectionData = pefile.GetSectionData(rva);
if (sectionData.Length == 0 && size != 0)
throw new BadImageFormatException($"Field data (rva=0x{rva:x}) could not be found in any section!");
if (size < 0 || size > sectionData.Length)
throw new BadImageFormatException($"Invalid size {size} for field data!");
return sectionData.GetReader(0, size);
}
sealed class FieldValueSizeDecoder : ISignatureTypeProvider<int, GenericContext>

Loading…
Cancel
Save