Skip to content
Snippets Groups Projects
Commit 848977cd authored by Matthew McGill's avatar Matthew McGill
Browse files

fill_in_cfg is its own class

Former-commit-id: 9453a478fad73471242bfc97ba8cc77a58ffd847
parent bb48c3fd
No related branches found
No related tags found
No related merge requests found
......@@ -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
......
......@@ -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);
......
......@@ -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;
......
......@@ -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)
{
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment