From bd396bff642ca89bc4c169749f721d8652ec8b79 Mon Sep 17 00:00:00 2001
From: Jason Hiser <jdhiser@gmail.com>
Date: Mon, 17 Dec 2018 21:40:45 -0500
Subject: [PATCH] updates for arm

---
 include/ehp.hpp  |  4 ++--
 src/ehp.cpp      | 22 ++++++++++++++--------
 src/ehp_priv.hpp |  6 +++---
 3 files changed, 19 insertions(+), 13 deletions(-)

diff --git a/include/ehp.hpp b/include/ehp.hpp
index a530905..a37f757 100644
--- a/include/ehp.hpp
+++ b/include/ehp.hpp
@@ -55,7 +55,7 @@ class EHProgram_t
 	EHProgram_t(const EHProgram_t&) {}
 	public:
 	virtual ~EHProgram_t() {}
-	virtual void print(const uint64_t start_addr=0) const=0;
+	virtual void print(const uint64_t start_addr, const int64_t caf) const=0;
 	virtual shared_ptr<EHProgramInstructionVector_t> getInstructions() const =0;
 };
 
@@ -74,7 +74,7 @@ class CIEContents_t
 	virtual string getAugmentation() const =0;
 	virtual uint8_t getLSDAEncoding() const =0;
 	virtual uint8_t getFDEEncoding() const =0;
-	virtual void print() const =0;
+	virtual void print(const uint64_t startAddr) const =0;
 };
 
 class LSDACallSiteAction_t 
diff --git a/src/ehp.cpp b/src/ehp.cpp
index 2f2f4fa..81b5bab 100644
--- a/src/ehp.cpp
+++ b/src/ehp.cpp
@@ -824,14 +824,14 @@ template <int ptrsize>
 void eh_program_t<ptrsize>::push_insn(const eh_program_insn_t<ptrsize> &i) { instructions.push_back(i); }
 
 template <int ptrsize>
-void eh_program_t<ptrsize>::print(const uint64_t start_addr) const
+void eh_program_t<ptrsize>::print(const uint64_t start_addr, const int64_t caf) const
 {
 	auto pc=start_addr;
 	cout << "			Program:                  " << endl ;
-	for_each(instructions.begin(), instructions.end(), [&](const eh_program_insn_t<ptrsize>& i)
+	for (const auto &i : instructions) 
 	{ 
-		i.print(pc);
-	});
+		i.print(pc,caf);
+	}
 }
 
 template <int ptrsize>
@@ -1034,7 +1034,7 @@ bool cie_contents_t<ptrsize>::parse_cie(
 }
 
 template <int ptrsize>
-void cie_contents_t<ptrsize>::print() const 
+void cie_contents_t<ptrsize>::print(const uint64_t startAddr) const 
 {
 	cout << "["<<setw(6)<<hex<<cie_position<<"] CIE length="<<dec<<length<<endl;
 	cout << "   CIE_id:                   " << +cie_id << endl;
@@ -1050,7 +1050,7 @@ void cie_contents_t<ptrsize>::print() const
 	cout << "                             lsda_encoding:        " << hex << +lsda_encoding << endl;
 	cout << "                             fde_encoding:         " << hex << +fde_encoding << endl;
 	cout << "   Program:        " << endl ;
-	eh_pgm.print();
+	eh_pgm.print(startAddr,getCAF());
 	
 }
 
@@ -1539,6 +1539,7 @@ bool fde_contents_t<ptrsize>::parse_fde(
 template <int ptrsize>
 void fde_contents_t<ptrsize>::print() const
 {
+	const auto caf=cie_info.getCAF();
 
 	cout << "["<<setw(6)<<hex<<fde_position<<"] FDE length="<<dec<<length;
 	cout <<" cie=["<<setw(6)<<hex<<cie_position<<"]"<<endl;
@@ -1547,7 +1548,7 @@ void fde_contents_t<ptrsize>::print() const
 	cout<<"		FDE End addr:		"<<hex<<fde_end_addr<<endl;
 	cout<<"		FDE len:		"<<dec<<fde_range_len<<endl;
 	cout<<"		FDE LSDA:		"<<hex<<lsda_addr<<endl;
-	eh_pgm.print(fde_start_addr);
+	eh_pgm.print(fde_start_addr, caf);
 	if(getCIE().getLSDAEncoding()!= DW_EH_PE_omit && lsda_addr!=0 /* indicator of nullptr for lsda */)
 		lsda.print();
 	else
@@ -1578,6 +1579,11 @@ bool split_eh_frame_impl_t<ptrsize>::iterate_fdes()
 		if(eh_frame_util_t<ptrsize>::read_length(act_length, position, eh_frame_scoop_data, max))
 			break;
 
+		// length field has to be meaningful, 0 or -1 indicates end of segment
+		// the exact end-of-segment marker varies platform to platform.
+		if(act_length==0 || act_length==0xffffffff || act_length == decltype(act_length)(-1))
+			break;
+
 		auto next_position=position + act_length;
 		auto cie_offset=uint32_t(0);
 		auto cie_offset_position=position;
@@ -1639,7 +1645,7 @@ void split_eh_frame_impl_t<ptrsize>::print() const
 {
 	for_each(cies.begin(), cies.end(), [&](const cie_contents_t<ptrsize>  &p)
 	{
-		p.print();
+		p.print(0 /* cie has no start address on its own */);
 	});
 	for_each(fdes.begin(), fdes.end(), [&](const fde_contents_t<ptrsize>  &p)
 	{
diff --git a/src/ehp_priv.hpp b/src/ehp_priv.hpp
index 11e5883..d8678d3 100644
--- a/src/ehp_priv.hpp
+++ b/src/ehp_priv.hpp
@@ -88,7 +88,7 @@ class eh_program_insn_t  : public EHProgramInstruction_t
 	eh_program_insn_t() ;
 	eh_program_insn_t(const std::string &s) ;
 
-	void print(uint64_t &pc, int64_t caf=1) const;
+	void print(uint64_t &pc, int64_t caf) const;
 
 	void push_byte(uint8_t c) ;
 
@@ -131,7 +131,7 @@ class eh_program_t : public EHProgram_t
 	public:
 	void push_insn(const eh_program_insn_t<ptrsize> &i); 
 
-	void print(const uint64_t start_addr=0) const;
+	void print(const uint64_t start_addr, const int64_t caf) const;
 
 	bool parse_program(
 		const uint32_t& program_start_position, 
@@ -186,7 +186,7 @@ class cie_contents_t : public CIEContents_t, private eh_frame_util_t<ptrsize>
 		const uint8_t* const data, 
 		const uint32_t max, 
 		const uint64_t eh_addr);
-	void print() const ;
+	void print(const uint64_t startAddr) const ;
 };
 
 template <int ptrsize>
-- 
GitLab