summaryrefslogtreecommitdiff
path: root/view/pe/peview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'view/pe/peview.cpp')
-rw-r--r--view/pe/peview.cpp22
1 files changed, 18 insertions, 4 deletions
diff --git a/view/pe/peview.cpp b/view/pe/peview.cpp
index 3ae26ea5..cfeb63b2 100644
--- a/view/pe/peview.cpp
+++ b/view/pe/peview.cpp
@@ -752,13 +752,27 @@ bool PEView::Init()
string resolvedName = name;
if (name[0] == '/' && header.coffSymbolTable)
{
- uint32_t stringTableBase = header.coffSymbolTable + (header.coffSymbolCount * 18);
errno = 0;
uint32_t offset = strtoul(name+1, nullptr, 10);
- if (errno == 0 && offset > 0 && stringTableBase + offset < GetParentView()->GetEnd())
+ if (errno == 0 && offset > 0)
{
- sectionNameReader.Seek(stringTableBase + offset);
- resolvedName = sectionNameReader.ReadCString();
+ BinaryReader stringReader(GetParentView(), LittleEndian);
+ uint64_t stringTableBase = header.coffSymbolTable + (header.coffSymbolCount * 18);
+ stringReader.Seek(stringTableBase);
+ uint32_t stringTableLen = stringReader.Read32();
+ if ((stringTableBase + stringTableLen) > GetParentView()->GetEnd())
+ {
+ m_logger->LogError("Cannot resolve section name \"%s\": String table is invalid length", name);
+ }
+ else if (stringTableBase + offset < GetParentView()->GetEnd())
+ {
+ sectionNameReader.Seek(stringTableBase + offset);
+ resolvedName = sectionNameReader.ReadCString();
+ }
+ else
+ {
+ m_logger->LogError("Cannot resolve section name \"%s\": Offset is past end of string table", name);
+ }
}
}
section.name = resolvedName;