Make RAnalFunction.cc come from RAnal String Pool ##anal (#15281)

This commit is contained in:
Florian Märkl 2019-10-15 15:53:05 +02:00 committed by radare
parent 56d3ca7743
commit da18e5aadc
8 changed files with 10 additions and 45 deletions

View File

@ -122,6 +122,7 @@ R_API RAnal *r_anal_new(void) {
if (!anal) {
return NULL;
}
anal->consts = NULL;
anal->os = strdup (R_SYS_OS);
anal->reflines = NULL;
anal->esil_goto_limit = R_ANAL_ESIL_GOTO_LIMIT;
@ -217,6 +218,7 @@ R_API RAnal *r_anal_free(RAnal *a) {
}
free (a->last_disasm_reg);
r_strbuf_free (a->cmdtail);
r_str_const_free (&a->consts);
free (a);
return NULL;
}

View File

@ -1659,7 +1659,7 @@ R_API int r_anal_fcn_add(RAnal *a, ut64 addr, ut64 size, const char *name, int t
append = true;
}
fcn->addr = fcn->meta.min = addr;
fcn->cc = r_str_const (r_anal_cc_default (a));
fcn->cc = r_str_const_at (&a->consts, r_anal_cc_default (a));
fcn->bits = a->bits;
r_anal_fcn_set_size (append ? NULL : a, fcn, size);
free (fcn->name);

View File

@ -609,7 +609,7 @@ static int java_analyze_fns_from_buffer( RAnal *anal, ut64 start, ut64 end, int
ut64 length = buf_len - offset;
RAnalFunction *fcn = r_anal_fcn_new ();
fcn->cc = r_str_const (r_anal_cc_default (anal));
fcn->cc = r_str_const_at (&anal->consts, r_anal_cc_default (anal));
result = analyze_from_code_buffer ( anal, fcn, addr, buffer+offset, length );
if (result == R_ANAL_RET_ERROR) {
eprintf ("Failed to parse java fn: %s @ 0x%04"PFMT64x"\n", fcn->name, fcn->addr);
@ -658,7 +658,7 @@ static int java_analyze_fns( RAnal *anal, ut64 start, ut64 end, int reftype, int
(check_addr_less_start (method, end) ||
check_addr_in_code (method, end))) {
RAnalFunction *fcn = r_anal_fcn_new ();
fcn->cc = r_str_const (r_anal_cc_default (anal));
fcn->cc = r_str_const_at (&anal->consts, r_anal_cc_default (anal));
java_set_function_prototype (anal, fcn, method);
result = analyze_from_code_attr (anal, fcn, method, loadaddr);
if (result == R_ANAL_RET_ERROR) {

View File

@ -216,7 +216,7 @@ static void createFunction(RCore *core, fcn_t* fcn, const char *name) {
f->name = name? strdup (name): r_str_newf ("%s.%" PFMT64x, pfx, fcn->addr);
f->addr = fcn->addr;
f->bits = core->anal->bits;
f->cc = r_str_const (r_anal_cc_default (core->anal));
f->cc = r_str_const_at (&core->anal->consts, r_anal_cc_default (core->anal));
r_anal_fcn_set_size (NULL, f, fcn->size);
f->type = R_ANAL_FCN_TYPE_FCN;

View File

@ -768,7 +768,7 @@ static int core_anal_fcn(RCore *core, ut64 at, ut64 from, int reftype, int depth
eprintf ("Error: new (fcn)\n");
return false;
}
fcn->cc = r_str_const (r_anal_cc_default (core->anal));
fcn->cc = r_str_const_at (&core->anal->consts, r_anal_cc_default (core->anal));
hint = r_anal_hint_get (core->anal, at);
if (hint && hint->bits == 16) {
// expand 16bit for function

View File

@ -592,53 +592,15 @@ R_API void r_core_anal_type_init(RCore *core) {
}
}
static int save_ptr(void *p, const char *k, const char *v) {
Sdb *sdbs[2];
sdbs[0] = ((Sdb**) p)[0];
sdbs[1] = ((Sdb**) p)[1];
if (!strncmp (v, "cc", strlen ("cc") + 1)) {
const char *x = sdb_const_get (sdbs[1], sdb_fmt ("cc.%s.name", k), 0);
char *tmp = sdb_fmt ("%p", x);
sdb_set (sdbs[0], tmp, x, 0);
}
return 1;
}
R_API void r_core_anal_cc_init(RCore *core) {
Sdb *sdbs[2] = {
sdb_new0 (),
core->anal->sdb_cc
};
const char *dir_prefix = r_config_get (core->config, "dir.prefix");
//save pointers and values stored inside them
//to recover from freeing heeps
const char *defaultcc = sdb_const_get (sdbs[1], "default.cc", 0);
sdb_set (sdbs[0], sdb_fmt ("0x%08"PFMT64x, r_num_get (NULL, defaultcc)), defaultcc, 0);
sdb_foreach (core->anal->sdb_cc, save_ptr, sdbs);
sdb_reset (core->anal->sdb_cc);
const char *anal_arch = r_config_get (core->config, "anal.arch");
int bits = core->anal->bits;
char *dbpath = sdb_fmt ("%s/"R2_SDB_FCNSIGN"/cc-%s-%d.sdb", dir_prefix, anal_arch, bits);
if (r_file_exists (dbpath)) {
sdb_concat_by_path (core->anal->sdb_cc, dbpath);
}
//restore all freed CC or replace with new default cc
RListIter *it;
RAnalFunction *fcn;
r_list_foreach (core->anal->fcns, it, fcn) {
const char *cc = NULL;
if (fcn->cc) {
char *ptr = sdb_fmt ("%p", fcn->cc);
cc = sdb_const_get (sdbs[0], ptr, 0);
}
if (!cc) {
cc = r_anal_cc_default (core->anal);
}
fcn->cc = r_str_const (cc);
}
sdb_close (sdbs[0]);
sdb_free (sdbs[0]);
}
static int bin_info(RCore *r, int mode, ut64 laddr) {

View File

@ -3290,7 +3290,7 @@ static int cmd_anal_fcn(RCore *core, const char *input) {
eprintf ("afc: Unknown calling convention '%s' for '%s'\n"
"See afcl for available types\n", cc, asmOs);
} else {
fcn->cc = (const char *) r_str_const (cc);
fcn->cc = r_str_const_at (&core->anal->consts, cc);
}
free (argument);
break;

View File

@ -278,7 +278,7 @@ typedef struct r_anal_function_t {
/*item_list *rets; // Type of return value */
char *rets;
short fmod; // static, inline or volatile?
const char *cc; // calling convention
const char *cc; // calling convention, should come from RAnal.consts
char* attr; // __attribute__(()) list
ut64 addr;
ut64 rb_max_addr; // maximum of meta.min + _size - 1 in the subtree, for fcn interval tree
@ -728,6 +728,7 @@ typedef struct r_anal_t {
bool use_ex;
RList *imports; // global imports
SetU *visited;
char **consts; // for r_str_const_*
} RAnal;
typedef struct r_anal_hint_t {