summaryrefslogtreecommitdiff
path: root/plugins/rtti
diff options
context:
space:
mode:
authorMason Reed <mason@vector35.com>2025-07-04 13:31:04 -0400
committerMason Reed <mason@vector35.com>2025-07-04 13:31:04 -0400
commitf8d3c5eab487e06ad4b944cc92f689e2e367107d (patch)
tree6a07436b1b1215a02d730e0f0c9191d42f2b0ee0 /plugins/rtti
parent5c2f42a8f33d79e99bec373ad046f91bae6be60b (diff)
[RTTI] Fix vtables straddling section boundaries causing a OOB exception
This fixes an issue with certain shared cache binaries where a VFT was placed at the tail of the const data section
Diffstat (limited to 'plugins/rtti')
-rw-r--r--plugins/rtti/itanium.cpp3
-rw-r--r--plugins/rtti/microsoft.cpp3
2 files changed, 6 insertions, 0 deletions
diff --git a/plugins/rtti/itanium.cpp b/plugins/rtti/itanium.cpp
index 018f8c6d..c2f1089b 100644
--- a/plugins/rtti/itanium.cpp
+++ b/plugins/rtti/itanium.cpp
@@ -561,6 +561,9 @@ std::optional<VirtualFunctionTableInfo> ItaniumRTTIProcessor::ProcessVFT(uint64_
std::vector<VirtualFunctionInfo> virtualFunctions = {};
while (true)
{
+ uint64_t readOffset = reader.GetOffset();
+ if (!m_view->IsValidOffset(readOffset))
+ break;
uint64_t vFuncAddr = reader.ReadPointer();
auto funcs = m_view->GetAnalysisFunctionsForAddress(vFuncAddr);
if (funcs.empty())
diff --git a/plugins/rtti/microsoft.cpp b/plugins/rtti/microsoft.cpp
index 55d1955f..de91b16a 100644
--- a/plugins/rtti/microsoft.cpp
+++ b/plugins/rtti/microsoft.cpp
@@ -487,6 +487,9 @@ std::optional<VirtualFunctionTableInfo> MicrosoftRTTIProcessor::ProcessVFT(uint6
std::vector<std::pair<uint64_t, std::optional<Ref<Function>>>> virtualFunctions = {};
while (true)
{
+ uint64_t readOffset = reader.GetOffset();
+ if (!m_view->IsValidOffset(readOffset))
+ break;
uint64_t vFuncAddr = reader.ReadPointer();
auto funcs = m_view->GetAnalysisFunctionsForAddress(vFuncAddr);
if (funcs.empty())