diff --git a/libIRDB/test/SConscript b/libIRDB/test/SConscript index 6a8156d2a984364bcc0ebecbc48bd86f0a1b2f8b..c94a07a0ab9fb0c3de4af52ea649f7b54f084908 100644 --- a/libIRDB/test/SConscript +++ b/libIRDB/test/SConscript @@ -34,7 +34,7 @@ if 'build_tools' not in myenv or myenv['build_tools'] is None or int(myenv['buil Default(install) installed=installed+install - pgm=myenv.Program("fill_in_cfg.exe", split_eh_frame+Split("fill_in_cfg.cpp"), LIBPATH=LIBPATH, LIBS=LIBS) + pgm=myenv.Program("fill_in_cfg.exe", split_eh_frame+Split("fill_in_cfg_driver.cpp fill_in_cfg.cpp"), LIBPATH=LIBPATH, LIBS=LIBS) install=myenv.Install("$SECURITY_TRANSFORMS_HOME/bin/", pgm) Default(install) installed=installed+install diff --git a/libIRDB/test/fill_in_cfg.cpp b/libIRDB/test/fill_in_cfg.cpp index abc42ec43f36cf1179815c91042757a3f71f7f37..676f866442038a6538c28d18453079100525c2f3 100644 --- a/libIRDB/test/fill_in_cfg.cpp +++ b/libIRDB/test/fill_in_cfg.cpp @@ -32,7 +32,7 @@ using namespace libIRDB; using namespace std; using namespace EXEIO; -void populate_instruction_map +void PopulateCFG::populate_instruction_map ( map< pair<db_id_t,virtual_offset_t>, Instruction_t*> &insnMap, FileIR_t *firp @@ -61,7 +61,7 @@ void populate_instruction_map } -void set_fallthrough +void PopulateCFG::set_fallthrough ( map< pair<db_id_t,virtual_offset_t>, Instruction_t*> &insnMap, DecodedInstruction_t *disasm, Instruction_t *insn, FileIR_t *firp @@ -112,7 +112,7 @@ void set_fallthrough } -void set_target +void PopulateCFG::set_target ( map< pair<db_id_t,virtual_offset_t>, Instruction_t*> &insnMap, DecodedInstruction_t *disasm, Instruction_t *insn, FileIR_t *firp @@ -187,14 +187,14 @@ void set_target } } -static File_t* find_file(FileIR_t* firp, db_id_t fileid) +File_t* PopulateCFG::find_file(FileIR_t* firp, db_id_t fileid) { assert(firp->GetFile()->GetBaseID()==fileid); return firp->GetFile(); } -void add_new_instructions(FileIR_t *firp) +void PopulateCFG::add_new_instructions(FileIR_t *firp) { int found_instructions=0; for( @@ -324,7 +324,7 @@ void add_new_instructions(FileIR_t *firp) } -void fill_in_cfg(FileIR_t *firp) +void PopulateCFG::fill_in_cfg(FileIR_t *firp) { int round=0; @@ -406,7 +406,7 @@ void fill_in_cfg(FileIR_t *firp) } -static bool is_in_relro_segment(const int secndx) +bool PopulateCFG::is_in_relro_segment(const int secndx) { ELFIO::elfio *real_elfiop = reinterpret_cast<ELFIO::elfio*>(elfiop->get_elfio()); if(!real_elfiop) @@ -448,7 +448,7 @@ static bool is_in_relro_segment(const int secndx) return false; } -void fill_in_scoops(FileIR_t *firp) +void PopulateCFG::fill_in_scoops(FileIR_t *firp) { auto max_base_id=firp->GetMaxBaseID(); @@ -522,7 +522,7 @@ void fill_in_scoops(FileIR_t *firp) } -void fill_in_landing_pads(FileIR_t *firp) +void PopulateCFG::fill_in_landing_pads(FileIR_t *firp) { const auto eh_frame_rep_ptr = split_eh_frame_t::factory(firp); // eh_frame_rep_ptr->parse(); already parsed now. @@ -580,11 +580,11 @@ void fill_in_landing_pads(FileIR_t *firp) } -PopulateCFG ParseAndConstruct +PopulateCFG PopulateCFG::Factory ( int argc, char* argv[], - pqxxDB_t the_pqxx_interface, + pqxxDB_t* the_pqxx_interface, list<FileIR_t *> the_firp_list ) { @@ -608,15 +608,13 @@ PopulateCFG ParseAndConstruct } } - return PopulateCFG(p_fix_landing_pads, the_pqxx_interface, the_firp_list); + return PopulateCFG(the_pqxx_interface, the_firp_list, p_fix_landing_pads); } -bool execute() +bool PopulateCFG::execute() { try { - assert(pqxx_interface); - for( FileIR_t* firp : firp_list) { assert(firp); @@ -626,7 +624,7 @@ bool execute() int elfoid=firp->GetFile()->GetELFOID(); pqxx::largeobject lo(elfoid); - lo.to_file(pqxx_interface.GetTransaction(),"readeh_tmp_file.exe"); + lo.to_file(pqxx_interface->GetTransaction(),"readeh_tmp_file.exe"); elfiop=new EXEIO::exeio; assert(elfiop); diff --git a/libIRDB/test/fill_in_cfg.hpp b/libIRDB/test/fill_in_cfg.hpp index 7f598fe8ab066b14abaa7a28d380f266a084bf26..abe5abc1239fce2f070e809cc3367731fdf28c32 100644 --- a/libIRDB/test/fill_in_cfg.hpp +++ b/libIRDB/test/fill_in_cfg.hpp @@ -9,14 +9,14 @@ class PopulateCFG { public: - PopulateCFG(bool p_fix_landing_pads = true, - libIRDB::pqxxDB_t the_pqxx_interface, - std::list<libIRDB::FileIR_t *> the_firp_list + PopulateCFG(libIRDB::pqxxDB_t* the_pqxx_interface, + std::list<libIRDB::FileIR_t *> the_firp_list, + bool p_fix_landing_pads = true ) : - fix_landing_pads(p_fix_landing_pads), pqxx_interface(the_pqxx_interface), - firp_list(the_firp_list) + firp_list(the_firp_list), + fix_landing_pads(p_fix_landing_pads) { odd_target_count = 0; bad_target_count = 0; @@ -25,7 +25,7 @@ class PopulateCFG elfiop = NULL; } - static PopulateCFG ParseAndConstruct(int argc, char* argv[], libIRDB::pqxxDB_t, std::list<libIRDB::FileIR_t *>); + static PopulateCFG Factory(int argc, char* argv[], libIRDB::pqxxDB_t*, std::list<libIRDB::FileIR_t *>); bool execute(); private: // methods @@ -38,40 +38,38 @@ class PopulateCFG // helpers void populate_instruction_map ( - std::map< std::pair<libIRDB::db_id_t,libIRDB::virtual_offset_t>, libIRDB::Instruction_t*>, + std::map< std::pair<libIRDB::db_id_t,libIRDB::virtual_offset_t>, libIRDB::Instruction_t*>&, libIRDB::FileIR_t * ); void set_fallthrough ( - std::map< std::pair<libIRDB::db_id_t,libIRDB::virtual_offset_t>, libIRDB::Instruction_t*>, + std::map< std::pair<libIRDB::db_id_t,libIRDB::virtual_offset_t>, libIRDB::Instruction_t*>&, libIRDB::DecodedInstruction_t *, libIRDB::Instruction_t *, libIRDB::FileIR_t * ); void set_target ( - std::map< std::pair<libIRDB::db_id_t,libIRDB::virtual_offset_t>, libIRDB::Instruction_t*>, + std::map< std::pair<libIRDB::db_id_t,libIRDB::virtual_offset_t>, libIRDB::Instruction_t*>&, libIRDB::DecodedInstruction_t *, libIRDB::Instruction_t *, libIRDB::FileIR_t * ); - static libIRDB::File_t* find_file(libIRDB::FileIR_t *, libIRDB::db_id_t); + libIRDB::File_t* find_file(libIRDB::FileIR_t *, libIRDB::db_id_t); void add_new_instructions(libIRDB::FileIR_t *); - static bool is_in_relro_segment(const int); + bool is_in_relro_segment(const int); private: //data - // options - bool fix_landing_pads; - // stats int odd_target_count; int bad_target_count; int bad_fallthrough_count; - auto failed_target_count; + unsigned int failed_target_count; // non-optional - libIRDB::pqxxDB_t pqxx_interface; + libIRDB::pqxxDB_t* pqxx_interface; std::list<libIRDB::FileIR_t *> firp_list; + bool fix_landing_pads; EXEIO::exeio *elfiop; std::set< std::pair<libIRDB::db_id_t,libIRDB::virtual_offset_t> > missed_instructions; diff --git a/libIRDB/test/fill_in_cfg_driver.cpp b/libIRDB/test/fill_in_cfg_driver.cpp index bbd66d9e059a20fb326ec92b59953dde2af2cd45..aee0cf8d678c0c0de3dc7d6d09dedf94df87b5fa 100644 --- a/libIRDB/test/fill_in_cfg_driver.cpp +++ b/libIRDB/test/fill_in_cfg_driver.cpp @@ -22,19 +22,19 @@ int main(int argc, char* argv[]) cout<<"New Variant, after reading registration, is: "<<*pidp << endl; // setup - for(set<File_t*> it : pidp->GetFiles()) + for(File_t* it : pidp->GetFiles()) { - File_t* this_file=*it; + File_t* this_file=it; assert(this_file); // read the db - firp=new FileIR_t(*pidp, this_file); + FileIR_t* firp=new FileIR_t(*pidp, this_file); assert(firp); the_firp_list.push_back(firp); } // fill_in_cfg for all files - PopulateCFG fill_in_cfg = PopulateCFG::ParseAndConstruct(argc, argv, the_pqxx_interface, the_firp_list); + PopulateCFG fill_in_cfg = PopulateCFG::Factory(argc, argv, &the_pqxx_interface, the_firp_list); bool success = fill_in_cfg.execute(); if(!success) @@ -45,13 +45,13 @@ int main(int argc, char* argv[]) // cleanup for(FileIR_t* the_firp : the_firp_list) + { assert(the_firp); // write the DB back and commit our changes the_firp->WriteToDB(); delete the_firp; - the_firp=NULL; } - pqxx_interface.Commit(); + the_pqxx_interface.Commit(); } catch (DatabaseError_t pnide) {