From 7bcbee673b02b3334a9c6829b1932f32e5635538 Mon Sep 17 00:00:00 2001
From: Jason Hiser <jdhiser@gmail.com>
Date: Mon, 16 Sep 2019 21:51:33 -0400
Subject: [PATCH] fixed memory error when PE file has no handler listed.

---
 irdb-libs/ir_builders/split_eh_frame.cpp | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/irdb-libs/ir_builders/split_eh_frame.cpp b/irdb-libs/ir_builders/split_eh_frame.cpp
index 1f1d6983b..4f7493f40 100644
--- a/irdb-libs/ir_builders/split_eh_frame.cpp
+++ b/irdb-libs/ir_builders/split_eh_frame.cpp
@@ -656,18 +656,19 @@ class pe_eh_split_t
 				const auto frame_reg       = uint8_t(unwind_struct.FrameRegister);
 				const auto frame_offset    = uint8_t(unwind_struct.FrameOffset);
 				const auto unwind_pgm_size = round_up_to(unwind_struct.CountOfCodes,2);
-				const auto handler_ptr     = reinterpret_cast<const uint32_t*>(&unwind_struct.UnwindCode[unwind_pgm_size]);
-				const auto handler_rva     = *handler_ptr;
-				const auto handler_addr    = firp->getArchitecture()->getFileBase() + handler_rva;
-				const auto handler_insn_it = offset_to_insn_map.find(handler_addr);
-				const auto handler_insn    = has_handler ? handler_insn_it->second : (Instruction_t*)nullptr;
 
 
-				assert( (handler_insn_it != end(offset_to_insn_map)) == has_handler);
-
-				auto user_data = string();
+				auto handler_insn = (Instruction_t*)nullptr;
+				auto user_data    = string();
 				if(has_handler)
 				{
+					const auto handler_ptr     = reinterpret_cast<const uint32_t*>(&unwind_struct.UnwindCode[unwind_pgm_size]);
+					const auto handler_rva     = *handler_ptr;
+					const auto handler_addr    = firp->getArchitecture()->getFileBase() + handler_rva;
+					const auto handler_insn_it = offset_to_insn_map.find(handler_addr);
+					assert(handler_insn_it != end(offset_to_insn_map));
+					handler_insn    = handler_insn_it->second ;
+
 					const auto unwind_user_data = reinterpret_cast<const char*>(handler_ptr) + sizeof(uint32_t);
 					const auto unwind_info_size_with_unwindcode_array = reinterpret_cast<const char*>(&unwind_struct.UnwindCode[unwind_pgm_size]) - reinterpret_cast<const char*>(&unwind_struct);
 					const auto user_data_addr   = firp->getArchitecture()->getFileBase() + unwind_addr + unwind_info_size_with_unwindcode_array;
-- 
GitLab