From 0028dc0fb2b02db2cf7423074464b7eb4278aa0f Mon Sep 17 00:00:00 2001
From: Jason Hiser <jdhiser@gmail.com>
Date: Mon, 8 Apr 2019 14:06:42 -0400
Subject: [PATCH] fixed -werror type issues

---
 push64_relocs.cpp | 177 +++++++++++++++++++---------------------------
 push64_relocs.h   | 155 ++++++++++++++++++++--------------------
 2 files changed, 151 insertions(+), 181 deletions(-)

diff --git a/push64_relocs.cpp b/push64_relocs.cpp
index 67031876f..2dcc98b94 100644
--- a/push64_relocs.cpp
+++ b/push64_relocs.cpp
@@ -33,9 +33,7 @@
 #include <algorithm>
 #include "push64_relocs.h"
 
-using namespace IRDB_SDK;
-using namespace Zipr_SDK;
-using namespace std;
+using namespace Push64Relocs;
 
 #define ALLOF(a) begin(a), end(a)
 
@@ -49,30 +47,26 @@ Push64Relocs_t::Push64Relocs_t(Zipr_SDK::Zipr_t* zipr_object)
 	m_verbose  = global->getBooleanOption("verbose");
 }
 
-bool Push64Relocs_t::IsRelocationWithType(Relocation_t *reloc,std::string type)
+bool Push64Relocs_t::IsRelocationWithType(Relocation_t *reloc,string type)
 {
-	return (reloc->getType().find(type) != std::string::npos);
+	return (reloc->getType().find(type) != string::npos);
 }
 
 // would be nice to have a FindRelocation function that takes a parameterized type.
-Relocation_t* Push64Relocs_t::FindRelocationWithType(Instruction_t* insn, std::string type)
+Relocation_t* Push64Relocs_t::FindRelocationWithType(Instruction_t* insn, string type)
 {
 	for(auto reloc : insn->getRelocations())
 	{
 		if (IsRelocationWithType(reloc, type))
 			return reloc;
 	}
-	return NULL;
+	return nullptr;
 }
 
-#define PUSH_DATA_BITS_MAX_LEN 16
 void Push64Relocs_t::HandlePush64Relocation(Instruction_t *insn, Relocation_t *reloc)
 {
-	// Instruction_t *push_insn = NULL, *jmp_insn = NULL;
-	VirtualOffset_t push_addr = 0;
-	string databits = "";
-	uint8_t push_data_bits[PUSH_DATA_BITS_MAX_LEN] = {0,};
-	int push_data_bits_len = 0;
+	const auto PUSH_DATA_BITS_MAX_LEN  = 16;
+	auto push_data_bits = vector<uint8_t>(PUSH_DATA_BITS_MAX_LEN);
 
 	plopped_relocs.insert(insn);	
 
@@ -80,73 +74,56 @@ void Push64Relocs_t::HandlePush64Relocation(Instruction_t *insn, Relocation_t *r
 	auto jmp_insn = insn->getFallthrough();
 	assert(jmp_insn);
 
-	push_data_bits_len = push_insn->getDataBits().length();
-	assert(push_data_bits_len<PUSH_DATA_BITS_MAX_LEN);
-	memcpy(push_data_bits,
-	       (uint8_t*)push_insn->getDataBits().c_str(),
-				 push_data_bits_len);
+	auto push_data_bits_len = push_insn->getDataBits().length();
+	assert(push_data_bits_len < PUSH_DATA_BITS_MAX_LEN);
+	memcpy(push_data_bits.data(), (uint8_t*)push_insn->getDataBits().c_str(), push_data_bits_len);
+
 	/*
 	 * Because we know that this is a push instruction,
 	 * we know that the opcode is one byte.
 	 * The pushed value will start at the 1th offset.
 	 */
-	// push_addr = *((VirtualOffset_t*)(push_data_bits+1));
+	auto push_addr = VirtualOffset_t(0);
 	memcpy(&push_addr,&push_data_bits[1], 4);
 
 	if (*m_verbose)
-		cout << "push_addr: 0x" << std::hex << push_addr << endl;
+		cout << "push_addr: 0x" << hex << push_addr << endl;
 	assert(push_addr != 0);
 
 	/* 
 	 * Step 0: Add the add instruction and its address.
 	 */
 	auto add_addr=m_firp.addNewAddress(push_insn->getAddress()->getFileID(), 0);
-	auto add_insn=m_firp.addNewInstruction(
-			add_addr,
-			push_insn->getFunction()
-			);
+	auto add_insn=m_firp.addNewInstruction( add_addr, push_insn->getFunction());
+
 	/* 
 	 * Step 1: Change the push to a call 0.
 	 */
 
-// this is OK, but could we consider the insn->Assemble() method for readability? 
-	databits.resize(5);
-	databits[0] = 0xe8;
-	databits[1] = 0x00;
-	databits[2] = 0x00;
-	databits[3] = 0x00;
-	databits[4] = 0x00;
-	insn->setDataBits(databits);
+	auto call_databits = string({int8_t(0xe8), 0x00, 0x00, 0x00, 0x00 });
+	insn->setDataBits(call_databits);
 	insn->setTarget(add_insn); // Comment
-	insn->setFallthrough(NULL);
+	insn->setFallthrough(nullptr);
 	insn->setComment(push_insn->getComment()+" Thunk part");
 
 		
 	/* 
 	 * Step 2: Create the add instruction.
 	 */
-// this is OK, but could we consider the insn->Assemble() method for readability? 
-	databits = "";
+	auto add_databits = string();
 	if(m_firp.getArchitectureBitWidth()==64)
-		databits+=(char)0x48;	 // rex prefix to convert esp->rsp
-	databits+=(char)0x81;
-	databits+=(char)0x2c;	
-	databits+=(char)0x24;
-	databits+=(char)0xff;
-	databits+=(char)0xff;
-	databits+=(char)0xff;
-	databits+=(char)0xff;
-	add_insn->setDataBits(databits);
+		add_databits+=string({0x48});	 // rex prefix to convert esp->rsp
+	add_databits+=string({(int8_t)0x81, 0x2c, 0x24, (int8_t)0xff, (int8_t)0xff, (int8_t)0xff, (int8_t)0xff} );
+	add_insn->setDataBits(add_databits);
 
 	/*
 	 * Step 3: Put the relocation on the add instruction.
 	 */
-	auto add_reloc=m_firp.addNewRelocation(add_insn,push_addr,"add64");
+	auto add_reloc=m_firp.addNewRelocation(add_insn, push_addr, "add64");
 
 	if (*m_verbose)
 		cout << "Adding an add/sub with reloc offset 0x" 
-		     << std::hex << add_reloc->getOffset() 
-				 << endl;
+		     << hex << add_reloc->getOffset() << endl;
 	/*
 	 * Step 4: Tell the add insn to fallthrough to the call.
 	 */
@@ -155,22 +132,22 @@ void Push64Relocs_t::HandlePush64Relocation(Instruction_t *insn, Relocation_t *r
 
 void Push64Relocs_t::HandlePush64Relocs()
 {
-	int push64_relocations_count=0;
-	int pcrel_relocations_count=0;
+	auto push64_relocations_count = 0;
+	auto pcrel_relocations_count  = 0;
+
 	// for each instruction 
 	for(auto insn : m_firp.getInstructions())
 	{
-		auto reloc= FindPushRelocation(insn);
-		// caution, side effect in if statement.
-		if (reloc) 
+		const auto push_reloc = FindPushRelocation(insn);
+		if (push_reloc != nullptr)  
 		{
 			if (*m_verbose)
-				cout << "Found a Push relocation:" << insn->getDisassembly()<<endl;
-			HandlePush64Relocation(insn,reloc);
+				cout << "Found a Push relocation:" << insn->getDisassembly() << endl;
+			HandlePush64Relocation(insn,push_reloc);
 			push64_relocations_count++;
 		}
-		reloc = FindPcrelRelocation(insn);
-		if (reloc)
+		const auto pcrel_reloc = FindPcrelRelocation(insn);
+		if (pcrel_reloc != nullptr)
 		{
 			if (*m_verbose)
 				cout << "Found a pcrel relocation." << endl;
@@ -179,12 +156,10 @@ void Push64Relocs_t::HandlePush64Relocs()
 		}
 	}
 
-	cout<<"# ATTRIBUTE Push_Relocations::push_relocations_count="
-	    <<std::dec<<push64_relocations_count
-			<<endl;
-	cout<<"# ATTRIBUTE Push_Relocations::pcrel_relocations_count="
-	    <<std::dec<<pcrel_relocations_count
-			<<endl;
+	cout << "# ATTRIBUTE Push_Relocations::push_relocations_count="
+	     << dec << push64_relocations_count << endl;
+	cout << "# ATTRIBUTE Push_Relocations::pcrel_relocations_count="
+	     << dec << pcrel_relocations_count << endl;
 }
 
 
@@ -192,31 +167,18 @@ void Push64Relocs_t::UpdatePush64Adds()
 {
 	if (*m_verbose)
 		cout << "push64:UpdatePush64Adds()" << endl;
+
 	for(auto insn : plopped_relocs)
 	{
 		auto reloc = FindPushRelocation(insn);
 		if (reloc)
 		{
-// would consider updating this if statement to be a function call for simplicity/readability.
-			bool change_to_add = false;
-			RangeAddress_t call_addr = 0;
-			RangeAddress_t add_addr = 0;
-			RangeAddress_t wrt_addr = 0;
-			int add_offset = 0;
-			uint32_t relocated_value = 0;
-			Instruction_t *call = NULL, *add = NULL;
-			Relocation_t *add_reloc = NULL;
-
-			call = insn;
-			add = call->getTarget();
-
-			assert(call && add);
-
-			call_addr = final_insn_locations[call];
-			add_addr = final_insn_locations[add];
-			auto wrt_insn=dynamic_cast<Instruction_t*>(reloc->getWRT());
-			if(wrt_insn)
-				wrt_addr=final_insn_locations[wrt_insn];
+			auto call      = insn;                             assert(call != nullptr);
+			auto add       = call->getTarget();                assert(add  != nullptr);
+			auto call_addr = final_insn_locations[call];
+			auto add_addr  = final_insn_locations[add];
+			auto wrt_insn  = dynamic_cast<Instruction_t*>(reloc->getWRT());
+			auto wrt_addr  = wrt_insn ?  final_insn_locations[wrt_insn] : RangeAddress_t(0);
 
 			if (call_addr == 0 || add_addr == 0)
 			{
@@ -225,51 +187,56 @@ void Push64Relocs_t::UpdatePush64Adds()
 				continue;
 			}
 
-			add_reloc = FindAdd64Relocation(add);
-			assert(add_reloc && "push64:Add in Call/Add pair must have relocation.");
+			auto add_reloc = FindAdd64Relocation(add);
+			assert(add_reloc != nullptr); 
 
-			add_offset = add_reloc->getOffset();
+			auto add_offset = add_reloc->getOffset();
 
 			/*
 			 * Stupid call will push the NEXT instruction address.
 			 */
-			call_addr+=call->getDataBits().length();
-
-
-// would this be simpler if we always used an add (or sub)
-// and just signed the sign of the value we are adding (or subbing)?
-			if ((size_t)add_offset>(size_t)call_addr)
+			auto ret_addr = call_addr + call->getDataBits().length();
+			auto change_to_add   = false;
+
+#if 1
+			const auto reloc_adjustnent_value = wrt_insn ? wrt_addr : (m_firp.getArchitecture()->getFileBase() + add_offset);
+			const auto relocated_value = ret_addr - reloc_adjustnent_value;
+#else
+			auto relocated_value = uint32_t(0);
+			if ((size_t)add_offset > (size_t)ret_addr)
 			{
 				change_to_add = true;
 				if(wrt_insn)
-					relocated_value= wrt_addr - call_addr;
+					relocated_value = wrt_addr   - ret_addr;
 				else
-					relocated_value = add_offset - call_addr;
+					relocated_value = add_offset - ret_addr;
 			}
 			else
-			// never covert it, a sub with a negative value is just fine.
 			{
 				if(wrt_insn)
-					relocated_value= call_addr - wrt_addr;
+					relocated_value = ret_addr - wrt_addr;
 				else
-					relocated_value = call_addr - add_offset;
+					relocated_value = ret_addr - (firp->getArchtecture()->getFileBase() + add_offset);
 			}
+#endif
+
+			cout << "Push64:Relocating a(n) " << ((change_to_add) ? "add":"sub") << " from " 
+			     << hex << ret_addr << " at " << hex << add_addr << endl;
+
+			cout << "push64:Using 0x" << hex << relocated_value 
+			     << " as the updated offset." << endl;
+
+			cout << "Using 0x" << hex << add_offset 
+			     << " as the base offset." << endl;
 
-			cout << "Push64:Relocating a(n) "<< ((change_to_add) ? "add":"sub") << " from " 
-			     << std::hex << call_addr 
-					 << " at "
-					 << std::hex << add_addr
-					 << endl
-			     << "push64:Using 0x" << std::hex << relocated_value 
-			     << " as the updated offset." << endl
-					 << "Using 0x" << std::hex << add_offset 
-					 << " as the base offset." << endl;
 			const auto rex_skip=m_firp.getArchitectureBitWidth()==64 ? 1 : 0;
+#if 0
 			if (change_to_add)
 			{
 				char add = (char)0x04;
 				m_memory_space.plopBytes(add_addr+rex_skip+1, (const char*)&add, 1);
 			}
+#endif
 			m_memory_space.plopBytes(add_addr+rex_skip+3, (const char*)&relocated_value, 4);
 		}
 	}
diff --git a/push64_relocs.h b/push64_relocs.h
index f97caaa3a..0996a4725 100644
--- a/push64_relocs.h
+++ b/push64_relocs.h
@@ -34,93 +34,96 @@
 #include <irdb-core>
 #include <zipr-sdk>
 
-class Push64Relocs_t : public Zipr_SDK::ZiprPluginInterface_t
+namespace Push64Relocs
 {
-	public:
-		Push64Relocs_t(Zipr_SDK::Zipr_t* zipr_object);
 
-		virtual void doPinningEnd() override
-		{ 
-			// if(m_elfio.get_type()==ET_EXEC)
-			if(m_firp.getArchitecture()->getFileType()==IRDB_SDK::adftELFEXE)
-			{
-				std::cout<<"Push64_reloc: elide PinningEnd as type==ET_EXEC"<<std::endl;
-				return;
-			}
-			std::cout<<"Push64Plugin: Ending  pinning, applying push64 relocs."<<std::endl;
-			HandlePush64Relocs(); 
-		}
-		virtual void doCallbackLinkingEnd() override
-		{
-			// if(m_elfio.get_type()==ET_EXEC)
-			if(m_firp.getArchitecture()->getFileType()==IRDB_SDK::adftELFEXE)
-			{
-				std::cout<<"Push64_reloc: elide CallbackLinkingEnd as type==ET_EXEC"<<std::endl;
-				return;
+	using namespace std;
+	using namespace IRDB_SDK;
+	using namespace Zipr_SDK;
+
+	class Push64Relocs_t : public ZiprPluginInterface_t
+	{
+		public:
+			Push64Relocs_t(Zipr_t* zipr_object);
+
+			virtual void doPinningEnd() override
+			{ 
+				if(m_firp.getArchitecture()->getFileType()==adftELFEXE)
+				{
+					cout<<"Push64_reloc: elide PinningEnd as type==ET_EXEC"<<endl;
+					return;
+				}
+				cout<<"Push64Plugin: Ending  pinning, applying push64 relocs."<<endl;
+				HandlePush64Relocs(); 
 			}
-			std::cout<<"Push64Plugin: CBLinkEnd, updating adds."  <<std::endl;
-			UpdatePush64Adds(); 
-		}
-
-		// virtual Zipr_SDK::ZiprOptionsNamespace_t *registerOptions(Zipr_SDK::ZiprOptionsNamespace_t *) override;
-	private:
-		// main workhorses
-		void HandlePush64Relocs();
-		void UpdatePush64Adds();
-
-		// subsidiary workhorses 
-		void HandlePush64Relocation(IRDB_SDK::Instruction_t* insn, IRDB_SDK::Relocation_t *reloc);
-
-		// helpers
-		bool IsPcrelRelocation(IRDB_SDK::Relocation_t *reloc)
-		{ return IsRelocationWithType(reloc,"pcrel"); }
-		bool IsAdd64Relocation(IRDB_SDK::Relocation_t *reloc)
-		{ return IsRelocationWithType(reloc,"add64"); }
-		bool IsPush64Relocation(IRDB_SDK::Relocation_t *reloc)
-		{ return IsRelocationWithType(reloc,"push64"); }
-		bool Is32BitRelocation(IRDB_SDK::Relocation_t *reloc)
-		{ return IsRelocationWithType(reloc,"push64"); }
-
-		IRDB_SDK::Relocation_t* FindPcrelRelocation(IRDB_SDK::Instruction_t* insn)
-		{ return FindRelocationWithType(insn,"pcrel"); }
-		IRDB_SDK::Relocation_t* FindAdd64Relocation(IRDB_SDK::Instruction_t* insn)
-		{ return FindRelocationWithType(insn,"add64"); }
-		IRDB_SDK::Relocation_t* FindPush64Relocation(IRDB_SDK::Instruction_t* insn)
-		{ return FindRelocationWithType(insn,"push64"); }
-		IRDB_SDK::Relocation_t* Find32BitRelocation(IRDB_SDK::Instruction_t* insn)
-		{ return FindRelocationWithType(insn,"32-bit"); }
-
-		IRDB_SDK::Relocation_t* FindPushRelocation(IRDB_SDK::Instruction_t* insn)
-		{ 
-			auto reloc=FindPush64Relocation(insn);
-			if(reloc)
+			virtual void doCallbackLinkingEnd() override
 			{
-				return reloc; 
+				if(m_firp.getArchitecture()->getFileType()==adftELFEXE)
+				{
+					cout<<"Push64_reloc: elide CallbackLinkingEnd as type==ET_EXEC"<<endl;
+					return;
+				}
+				cout<<"Push64Plugin: CBLinkEnd, updating adds."  <<endl;
+				UpdatePush64Adds(); 
 			}
-			reloc=Find32BitRelocation(insn);
-			if(reloc)
-			{
-				return reloc; 
-			}
-			return NULL;
-		}
-
-		bool IsRelocationWithType(IRDB_SDK::Relocation_t *reloc, std::string type);
-		IRDB_SDK::Relocation_t* FindRelocationWithType(IRDB_SDK::Instruction_t* insn, std::string type);
 
+		private:
+			// main workhorses
+			void HandlePush64Relocs();
+			void UpdatePush64Adds();
+
+			// subsidiary workhorses 
+			void HandlePush64Relocation(Instruction_t* insn, Relocation_t *reloc);
+
+			// helpers
+			bool IsPcrelRelocation(Relocation_t *reloc)
+			{ return IsRelocationWithType(reloc,"pcrel"); }
+			bool IsAdd64Relocation(Relocation_t *reloc)
+			{ return IsRelocationWithType(reloc,"add64"); }
+			bool IsPush64Relocation(Relocation_t *reloc)
+			{ return IsRelocationWithType(reloc,"push64"); }
+			bool Is32BitRelocation(Relocation_t *reloc)
+			{ return IsRelocationWithType(reloc,"push64"); }
+
+			Relocation_t* FindPcrelRelocation(Instruction_t* insn)
+			{ return FindRelocationWithType(insn,"pcrel"); }
+			Relocation_t* FindAdd64Relocation(Instruction_t* insn)
+			{ return FindRelocationWithType(insn,"add64"); }
+			Relocation_t* FindPush64Relocation(Instruction_t* insn)
+			{ return FindRelocationWithType(insn,"push64"); }
+			Relocation_t* Find32BitRelocation(Instruction_t* insn)
+			{ return FindRelocationWithType(insn,"32-bit"); }
+
+			Relocation_t* FindPushRelocation(Instruction_t* insn)
+			{ 
+				auto reloc=FindPush64Relocation(insn);
+				if(reloc != nullptr)
+				{
+					return reloc; 
+				}
+				reloc=Find32BitRelocation(insn);
+				if(reloc != nullptr)
+				{
+					return reloc; 
+				}
+				return nullptr;
+			}
 
+			bool IsRelocationWithType(Relocation_t *reloc, string type);
+			Relocation_t* FindRelocationWithType(Instruction_t* insn, string type);
 
 
-		// references to input
-		Zipr_SDK::MemorySpace_t &m_memory_space;	
-		IRDB_SDK::FileIR_t& m_firp;
-		Zipr_SDK::InstructionLocationMap_t &final_insn_locations;
+			// references to input
+			MemorySpace_t &m_memory_space;	
+			FileIR_t& m_firp;
+			InstructionLocationMap_t &final_insn_locations;
 
-		// local data.
-		IRDB_SDK::InstructionSet_t plopped_relocs;
+			// local data.
+			InstructionSet_t plopped_relocs;
 
-		Zipr_SDK::ZiprBooleanOption_t *m_verbose;
+			ZiprBooleanOption_t *m_verbose;
 
-};
+	};
 
+}
 #endif
-- 
GitLab