From be60b5be0e531c9a2c8f30eef03f4a598ec11854 Mon Sep 17 00:00:00 2001
From: Matthew McGill <mm8bx@mega-techx41.maas>
Date: Mon, 9 Jul 2018 19:26:17 +0000
Subject: [PATCH] Marking push64/32-bit and data_to_insn_ptr targets as
 unpinned in IR builder

Former-commit-id: 05856b93444497e07a504e36d70584e86f9c7b94
---
 libIRDB/test/fill_in_indtargs.cpp | 17 +++++++++++++++++
 libIRDB/test/fix_calls.cpp        |  2 ++
 2 files changed, 19 insertions(+)

diff --git a/libIRDB/test/fill_in_indtargs.cpp b/libIRDB/test/fill_in_indtargs.cpp
index 6628eb46d..54545f177 100644
--- a/libIRDB/test/fill_in_indtargs.cpp
+++ b/libIRDB/test/fill_in_indtargs.cpp
@@ -2344,6 +2344,11 @@ void unpin_elf_tables(FileIR_t *firp, int64_t do_unpin_opt)
 
 						if(getenv("UNPIN_VERBOSE")!=0)
 							cout<<"Unpinning "+scoop->GetName()+" entry at offset "<<dec<<i<<endl;
+						// mark as unpinned
+						if(insn->GetIndirectBranchTargetAddress()!=NULL)
+						{
+							insn->GetIndirectBranchTargetAddress()->SetVirtualOffset(0);
+						}
 					}
 				}
 				else
@@ -2451,6 +2456,12 @@ void unpin_elf_tables(FileIR_t *firp, int64_t do_unpin_opt)
 						// add reloc to IR.
 						firp->GetRelocations().insert(nr);
 						scoop->GetRelocations().insert(nr);
+
+						// mark as unpinned
+                                                if(insn->GetIndirectBranchTargetAddress()!=NULL)
+                                                {
+                                                        insn->GetIndirectBranchTargetAddress()->SetVirtualOffset(0);
+                                                }
 					}
 					else
 					{
@@ -2603,6 +2614,12 @@ void unpin_type3_switchtable(FileIR_t* firp,Instruction_t* insn,DataScoop_t* sco
 					// remove rodata reference for hell nodes.
 					targets[table_entry]=newprov;
 					switch_targs.insert(ibt);
+
+					// mark as unpinned
+                                        if(ibt->GetIndirectBranchTargetAddress()!=NULL)
+                                        {
+                                                ibt->GetIndirectBranchTargetAddress()->SetVirtualOffset(0);
+                                        }
 				}
 			}
 		}
diff --git a/libIRDB/test/fix_calls.cpp b/libIRDB/test/fix_calls.cpp
index 2510b4df5..ff35805b0 100644
--- a/libIRDB/test/fix_calls.cpp
+++ b/libIRDB/test/fix_calls.cpp
@@ -637,6 +637,8 @@ void fix_call(Instruction_t* insn, FileIR_t *firp, bool can_unpin)
 				cout<<"Setting unpin for type="<< reloc->GetType()<< " address="
 				    <<hex<<insn->GetBaseID()<<":"<<insn->getDisassembly()<<endl;
 			}
+			// set newindirtarg as unpinned IBT
+		 	newindirtarg->GetIndirectBranchTargetAddress()->SetVirtualOffset(0);	
 			reloc->SetWRT(newindirtarg);
 		}
 	}
-- 
GitLab