diff --git a/SabreTools.Serialization/Deserializers/PortableExecutable.cs b/SabreTools.Serialization/Deserializers/PortableExecutable.cs index dcf0d5dd..f343930c 100644 --- a/SabreTools.Serialization/Deserializers/PortableExecutable.cs +++ b/SabreTools.Serialization/Deserializers/PortableExecutable.cs @@ -1256,7 +1256,7 @@ namespace SabreTools.Serialization.Deserializers // Read the data from the offset long offset = initialOffset + obj.DataRVA.ConvertVirtualAddress(sections); - if (offset > initialOffset && obj.Size > 0 && offset + (int)obj.Size < data.Length) + if (offset > initialOffset && obj.Size > 0 && offset + obj.Size < data.Length) { data.Seek(offset, SeekOrigin.Begin); obj.Data = data.ReadBytes((int)obj.Size); @@ -1313,7 +1313,7 @@ namespace SabreTools.Serialization.Deserializers var obj = new ResourceDirectoryString(); obj.Length = data.ReadUInt16LittleEndian(); - if (obj.Length > 0 && data.Position + obj.Length <= data.Length) + if (obj.Length > 0 && data.Position + (obj.Length * 2) <= data.Length) obj.UnicodeString = data.ReadBytes(obj.Length * 2); return obj; @@ -1328,11 +1328,14 @@ namespace SabreTools.Serialization.Deserializers /// Section table to use for virtual address translation /// Indicates if this is the top level or not /// Filled ResourceDirectoryTable on success, null on error - public static ResourceDirectoryTable ParseResourceDirectoryTable(Stream data, long initialOffset, long tableStart, SectionHeader[] sections, bool topLevel = false) + public static ResourceDirectoryTable? ParseResourceDirectoryTable(Stream data, long initialOffset, long tableStart, SectionHeader[] sections, bool topLevel = false) { var obj = new ResourceDirectoryTable(); obj.Characteristics = data.ReadUInt32LittleEndian(); + if (obj.Characteristics != 0) + return null; + obj.TimeDateStamp = data.ReadUInt32LittleEndian(); obj.MajorVersion = data.ReadUInt16LittleEndian(); obj.MinorVersion = data.ReadUInt16LittleEndian();