From c038638ea899d385db15c4d25e0cdce30350babd Mon Sep 17 00:00:00 2001
From: Jason Hiser <jdhiser@gmail.com>
Date: Thu, 23 May 2019 07:13:21 -0400
Subject: [PATCH] minor fixes for instructions that are likely bogus (i.e.,
 pcrel insns that access out-of-bounds memory)

---
 irdb-libs/ir_builders/fix_calls.cpp   | 4 +++-
 irdb-libs/libIRDB-util/src/params.cpp | 5 +++++
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/irdb-libs/ir_builders/fix_calls.cpp b/irdb-libs/ir_builders/fix_calls.cpp
index 519810db6..ff650611c 100644
--- a/irdb-libs/ir_builders/fix_calls.cpp
+++ b/irdb-libs/ir_builders/fix_calls.cpp
@@ -844,7 +844,9 @@ class FixCalls_t : public TransformStep_t
 						switch(size)
 						{
 							case 4:
-								assert( (uintptr_t)(int)newdisp == (uintptr_t)newdisp);
+								// if newdisp is negative (or bigger than 32-bit), then the instruction is accessing invalid memory.
+								// and is likely bogus.  we just skip doing any pc-rel for it.
+								if( (uintptr_t)(int32_t)newdisp != (uintptr_t)newdisp) continue;
 								*(int*)offsetptr=newdisp;
 								break;
 							case 1:
diff --git a/irdb-libs/libIRDB-util/src/params.cpp b/irdb-libs/libIRDB-util/src/params.cpp
index 68bab5b3a..a716a283e 100644
--- a/irdb-libs/libIRDB-util/src/params.cpp
+++ b/irdb-libs/libIRDB-util/src/params.cpp
@@ -70,9 +70,14 @@ bool IRDB_SDK::isParameterWrite(const IRDB_SDK::FileIR_t *firp, IRDB_SDK::Instru
 	if(!d.getOperand(0)->isMemory())
 		return false;
 
+	// pcrel instructions aren't to the stack.
+	if(d.getOperand(0)->isPcrel())
+		return false;
+
 	// check that base reg is esp.
 	if(!d.getOperand(0)->hasBaseRegister())
 		return false;
+
 	if(d.getOperand(0)->getBaseRegister() != 4)
 		return false;
 
-- 
GitLab