diff --git a/ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs b/ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs index 385462e7f..b62dd5eb9 100644 --- a/ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs +++ b/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; diff --git a/ICSharpCode.Decompiler/Metadata/Dom.cs b/ICSharpCode.Decompiler/Metadata/Dom.cs index 0da6f193d..ff440f8dc 100644 --- a/ICSharpCode.Decompiler/Metadata/Dom.cs +++ b/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); } } diff --git a/ICSharpCode.Decompiler/SRMExtensions.cs b/ICSharpCode.Decompiler/SRMExtensions.cs index 16701022b..1ed58909f 100644 --- a/ICSharpCode.Decompiler/SRMExtensions.cs +++ b/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