diff --git a/libr/anal/fcn.c b/libr/anal/fcn.c index dbaf22b871d42..022ceba4bbce7 100644 --- a/libr/anal/fcn.c +++ b/libr/anal/fcn.c @@ -1103,7 +1103,7 @@ static int fcn_recurse(RAnal *anal, RAnalFunction *fcn, ut64 addr, ut64 len, int // TODO: -1- if (ready) { ret = casetbl_addr == op->ptr - ? try_walkthrough_jmptbl (anal, fcn, bb, depth, addr, case_shift, jmptbl_addr, op->ptr, 4, table_size, default_case, 4) + ? r_anal_jmptbl_walk (anal, fcn, bb, depth, addr, case_shift, jmptbl_addr, op->ptr, 4, table_size, default_case, 4) : try_walkthrough_casetbl (anal, fcn, bb, depth, addr, case_shift, jmptbl_addr, casetbl_addr, op->ptr, 4, table_size, default_case, 4); if (ret) { anal->lea_jmptbl_ip = addr; @@ -1333,7 +1333,7 @@ static int fcn_recurse(RAnal *anal, RAnalFunction *fcn, ut64 addr, ut64 len, int if (anal->cmpval != UT64_MAX && default_case != UT64_MAX && (op->reg || op->ireg)) { // TODO -1 if (op->ireg) { - ret = try_walkthrough_jmptbl (anal, fcn, bb, depth, op->addr, 0, op->ptr, op->ptr, anal->config->bits >> 3, table_size, default_case, ret); + ret = r_anal_jmptbl_walk (anal, fcn, bb, depth, op->addr, 0, op->ptr, op->ptr, anal->config->bits >> 3, table_size, default_case, ret); } else { // op->reg ret = walkthrough_arm_jmptbl_style (anal, fcn, bb, depth, op->addr, op->ptr, anal->config->bits >> 3, table_size, default_case, ret); } @@ -1427,12 +1427,12 @@ static int fcn_recurse(RAnal *anal, RAnalFunction *fcn, ut64 addr, ut64 len, int tablesize *= 4; ut64 tblloc = jmptbl_ptr_addr; int sz = 4; - ret = try_walkthrough_jmptbl (anal, fcn, bb, depth, op->addr, 0, + ret = r_anal_jmptbl_walk (anal, fcn, bb, depth, op->addr, 0, tblloc, jmptbl_ptr_addr, sz, tablesize, default_case, ret); } else if (is_v850 && anal->opt.jmptbl) { int ptsz = (anal->cmpval && anal->cmpval != UT64_MAX)? anal->cmpval + 1: 4; if ((int)anal->cmpval > 0) { - ret = try_walkthrough_jmptbl (anal, fcn, bb, depth, op->addr, + ret = r_anal_jmptbl_walk (anal, fcn, bb, depth, op->addr, 0, op->addr + 2, op->addr + 2, 2, ptsz, 0, ret); } gotoBeach (R_ANAL_RET_END); @@ -1474,14 +1474,14 @@ static int fcn_recurse(RAnal *anal, RAnalFunction *fcn, ut64 addr, ut64 len, int } r_anal_op_free (prev_op); if (!case_table) { - ret = try_walkthrough_jmptbl (anal, fcn, bb, depth, op->addr, case_shift, op->ptr, op->ptr, anal->config->bits >> 3, table_size, default_case, ret); + ret = r_anal_jmptbl_walk (anal, fcn, bb, depth, op->addr, case_shift, op->ptr, op->ptr, anal->config->bits >> 3, table_size, default_case, ret); } } } else if (op->ptr != UT64_MAX && op->reg) { // direct jump ut64 table_size, default_case; st64 case_shift = 0; if (try_get_jmptbl_info (anal, fcn, op->addr, bb, &table_size, &default_case, &case_shift)) { - ret = try_walkthrough_jmptbl (anal, fcn, bb, depth - 1, op->addr, case_shift, op->ptr, op->ptr, anal->config->bits >> 3, table_size, default_case, ret); + ret = r_anal_jmptbl_walk (anal, fcn, bb, depth - 1, op->addr, case_shift, op->ptr, op->ptr, anal->config->bits >> 3, table_size, default_case, ret); } } else if (movdisp != UT64_MAX) { st64 case_shift = 0; @@ -1506,7 +1506,7 @@ static int fcn_recurse(RAnal *anal, RAnalFunction *fcn, ut64 addr, ut64 len, int table_size = anal->cmpval + 1; default_case = -1; } - ret = try_walkthrough_jmptbl (anal, fcn, bb, depth - 1, op->addr, case_shift, jmptbl_base + movdisp, jmptbl_base, movscale, table_size, default_case, ret); + ret = r_anal_jmptbl_walk (anal, fcn, bb, depth - 1, op->addr, case_shift, jmptbl_base + movdisp, jmptbl_base, movscale, table_size, default_case, ret); anal->cmpval = UT64_MAX; #if 0 } else if (movdisp != UT64_MAX) { @@ -1514,7 +1514,7 @@ static int fcn_recurse(RAnal *anal, RAnalFunction *fcn, ut64 addr, ut64 len, int st64 case_shift; if (try_get_jmptbl_info (anal, fcn, op->addr, bb, &table_size, &default_case, &case_shift)) { op->ptr = movdisp; - ret = try_walkthrough_jmptbl (anal, fcn, bb, depth - 1, op->addr, case_shift, op->ptr, op->ptr, anal->config->bits >> 3, table_size, default_case, ret); + ret = r_anal_jmptbl_walk (anal, fcn, bb, depth - 1, op->addr, case_shift, op->ptr, op->ptr, anal->config->bits >> 3, table_size, default_case, ret); } movdisp = UT64_MAX; #endif @@ -1560,7 +1560,7 @@ static int fcn_recurse(RAnal *anal, RAnalFunction *fcn, ut64 addr, ut64 len, int count++; } // table_addr = 0x100004114; - ret = try_walkthrough_jmptbl (anal, + ret = r_anal_jmptbl_walk (anal, fcn, bb, depth - 1, op->addr - 12, 0, table_addr, @@ -1577,7 +1577,7 @@ static int fcn_recurse(RAnal *anal, RAnalFunction *fcn, ut64 addr, ut64 len, int } else { table_size += anal->cmpval; } - ret = try_walkthrough_jmptbl (anal, fcn, bb, depth - 1, op->addr, 0, op->addr + op->size, + ret = r_anal_jmptbl_walk (anal, fcn, bb, depth - 1, op->addr, 0, op->addr + op->size, op->addr + 4, 1, table_size, UT64_MAX, ret); // skip inlined jumptable idx += table_size; @@ -1589,7 +1589,7 @@ static int fcn_recurse(RAnal *anal, RAnalFunction *fcn, ut64 addr, ut64 len, int } else { tablesize += anal->cmpval; } - ret = try_walkthrough_jmptbl (anal, fcn, bb, depth - 1, op->addr, 0, op->addr + op->size, + ret = r_anal_jmptbl_walk (anal, fcn, bb, depth - 1, op->addr, 0, op->addr + op->size, op->addr + 4, 2, tablesize, UT64_MAX, ret); // skip inlined jumptable idx += (tablesize * 2); diff --git a/libr/anal/jmptbl.c b/libr/anal/jmptbl.c index 3f9c5794020b9..bd42ea0dbd95d 100644 --- a/libr/anal/jmptbl.c +++ b/libr/anal/jmptbl.c @@ -45,7 +45,7 @@ static void apply_switch(RAnal *anal, ut64 switch_addr, ut64 jmptbl_addr, ut64 c // analyze a jmptablle inside a function // maybe rename to r_anal_function_jmptbl() ? R_API bool r_anal_jmptbl(RAnal *anal, RAnalFunction *fcn, RAnalBlock *block, ut64 jmpaddr, ut64 table, ut64 tablesize, ut64 default_addr) { const int depth = 50; - return try_walkthrough_jmptbl (anal, fcn, block, depth, jmpaddr, 0, table, table, tablesize, tablesize, default_addr, false); + return r_anal_jmptbl_walk (anal, fcn, block, depth, jmpaddr, 0, table, table, tablesize, tablesize, default_addr, false); } static inline void analyze_new_case(RAnal *anal, RAnalFunction *fcn, RAnalBlock *block, ut64 ip, ut64 jmpptr, int depth) { @@ -166,8 +166,7 @@ R_API bool try_walkthrough_casetbl(RAnal *anal, RAnalFunction *fcn, RAnalBlock * return ret; } -// TODO R2_600 - this api name must start with `r_anal_jmptbl` -R_API bool try_walkthrough_jmptbl(RAnal *anal, RAnalFunction *fcn, RAnalBlock *block, int depth, ut64 ip, st64 start_casenum_shift, ut64 jmptbl_loc, ut64 jmptbl_off, ut64 sz, ut64 jmptbl_size, ut64 default_case, bool ret0) { +R_API bool r_anal_jmptbl_walk(RAnal *anal, RAnalFunction *fcn, RAnalBlock *block, int depth, ut64 ip, st64 start_casenum_shift, ut64 jmptbl_loc, ut64 jmptbl_off, ut64 sz, ut64 jmptbl_size, ut64 default_case, bool ret0) { bool ret = ret0; // jmptbl_size can not always be determined if (jmptbl_size == 0) { diff --git a/libr/core/cmd_anal.inc.c b/libr/core/cmd_anal.inc.c index 49ddc723aecca..f4f5fb74b44ad 100644 --- a/libr/core/cmd_anal.inc.c +++ b/libr/core/cmd_anal.inc.c @@ -5259,7 +5259,7 @@ static int cmd_af(RCore *core, const char *input) { ut64 elements = r_num_math (core->num, r_list_get_n (argv, 3)); ut64 seg = r_num_math (core->num, r_list_get_n (argv, 4)); int depth = 50; - try_walkthrough_jmptbl (core->anal, r_list_first (block->fcns), block, + r_anal_jmptbl_walk (core->anal, r_list_first (block->fcns), block, depth, core->offset, 0, table, seg, sz, elements, 0, false); free (args); } else { diff --git a/libr/include/r_anal.h b/libr/include/r_anal.h index e84a9d8458867..9f8e4a544cc31 100644 --- a/libr/include/r_anal.h +++ b/libr/include/r_anal.h @@ -1225,7 +1225,7 @@ R_API bool r_anal_jmptbl(RAnal *anal, RAnalFunction *fcn, RAnalBlock *block, ut6 // TODO: should be renamed R_API bool try_get_delta_jmptbl_info(RAnal *a, RAnalFunction *fcn, ut64 jmp_addr, ut64 lea_addr, ut64 *table_size, ut64 *default_case, st64 *start_casenum_shift); -R_API bool try_walkthrough_jmptbl(RAnal *analysis, RAnalFunction *fcn, RAnalBlock *block, int depth, ut64 ip, st64 start_casenum_shift, ut64 jmptbl_loc, ut64 jmptbl_off, ut64 sz, ut64 jmptbl_size, ut64 default_case, bool ret0); +R_API bool r_anal_jmptbl_walk(RAnal *analysis, RAnalFunction *fcn, RAnalBlock *block, int depth, ut64 ip, st64 start_casenum_shift, ut64 jmptbl_loc, ut64 jmptbl_off, ut64 sz, ut64 jmptbl_size, ut64 default_case, bool ret0); R_API bool try_walkthrough_casetbl(RAnal *analysis, RAnalFunction *fcn, RAnalBlock *block, int depth, ut64 ip, st64 start_casenum_shift, ut64 jmptbl_loc, ut64 casetbl_loc, ut64 jmptbl_off, ut64 sz, ut64 jmptbl_size, ut64 default_case, bool ret0); R_API bool try_get_jmptbl_info(RAnal *analysis, RAnalFunction *fcn, ut64 addr, RAnalBlock *my_bb, ut64 *table_size, ut64 *default_case, st64 *start_casenum_shift); R_API int walkthrough_arm_jmptbl_style(RAnal *anal, RAnalFunction *fcn, RAnalBlock *block, int depth, ut64 ip, ut64 jmptbl_loc, ut64 sz, ut64 jmptbl_size, ut64 default_case, int ret0);