From 2be33b845d7bcf4ec2fd07516ba66178b7cd7a31 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Mon, 8 Sep 2025 22:09:12 -0400 Subject: [PATCH] Be even more careful --- .../Deserializers/PortableExecutable.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) 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();