Fixes #133660: Dword in the middle

This commit is contained in:
deepakchethan 2019-04-26 04:20:42 +05:30 committed by radare
parent b02c8b7caf
commit 7f11846a38
3 changed files with 51 additions and 16 deletions

View File

@ -498,6 +498,48 @@ R_API RAnalMetaItem *r_meta_find_in(RAnal *a, ut64 at, int type, int where) {
return NULL;
}
R_API RList *r_meta_find_list_in(RAnal *a, ut64 at, int type, int where) {
char *res = meta_inrange_get (a, at, 1);
if (!res) {
return NULL;
}
RList *list = r_str_split_list (res, ",");
RList *out = r_list_new ();
if (!out) {
return NULL;
}
RListIter *iter;
const char *meta;
r_list_foreach (list, iter, meta) {
Sdb *s = a->sdb_meta;
ut64 mia = r_num_math (NULL, meta);
const char *key = sdb_fmt("meta.0x%" PFMT64x, mia);
const char *infos = sdb_const_get (s, key, 0);
if (!infos) {
return NULL;
}
for (; *infos; infos++) {
if (*infos == ',') {
continue;
}
const char *key = sdb_fmt ("meta.%c.0x%" PFMT64x, *infos, mia);
const char *metas = sdb_const_get (s, key, 0);
if (metas) {
RAnalMetaItem *mi = R_NEW0 (RAnalMetaItem);
if (!r_meta_deserialize_val (a, mi, *infos, mia, metas)) {
continue;
}
if (mi && (at >= mi->from && at < mi->to)) {
r_list_append (out, mi);
}
}
}
}
r_list_free (list);
free (res);
return out;
}
R_API const char *r_meta_type_to_string(int type) {
// XXX: use type as '%c'
switch (type) {

View File

@ -2666,9 +2666,10 @@ static int ds_print_meta_infos(RDisasmState *ds, ut8* buf, int len, int idx) {
int ret = 0;
const char *infos, *metas;
char key[100];
RAnalMetaItem MI, *mi = &MI;
RAnalMetaItem *mi;
RCore *core = ds->core;
Sdb *s = core->anal->sdb_meta;
RListIter *iter;
if (!ds->asm_meta) {
return 0;
}
@ -2677,23 +2678,14 @@ static int ds_print_meta_infos(RDisasmState *ds, ut8* buf, int len, int idx) {
infos = sdb_const_get (s, key, 0);
ds->mi_found = false;
if (infos && *infos) {
RList *list = r_meta_find_list_in (core->anal, ds->at, R_META_TYPE_ANY, R_META_WHERE_HERE);
if (list) {
if (ds->show_flag_in_bytes) {
ds_print_show_bytes (ds);
}
for (; *infos; infos++) {
if (*infos == ',') {
continue;
}
snprintf (key, sizeof (key), "meta.%c.0x%" PFMT64x, *infos, ds->at);
metas = sdb_const_get (s, key, 0);
if (!metas) {
continue;
}
if (!r_meta_deserialize_val (core->anal, mi, *infos, ds->at, metas)) {
continue;
}
// TODO: implement ranged meta find (if not at the begging of function..
r_list_foreach (list, iter, mi) {
char *out = NULL;
int hexlen;
int delta;
@ -2778,9 +2770,9 @@ static int ds_print_meta_infos(RDisasmState *ds, ut8* buf, int len, int idx) {
break;
}
}
R_FREE (MI.str);
}
}
r_list_free (list);
return ret;
}

View File

@ -1653,6 +1653,7 @@ R_API void r_anal_data_free (RAnalData *d);
R_API char *r_anal_data_to_string(RAnalData *d, RConsPrintablePalette *pal);
R_API void r_meta_free(RAnal *m);
R_API RList *r_meta_find_list_in(RAnal *a, ut64 at, int type, int where);
R_API void r_meta_space_unset_for(RAnal *a, const RSpace *space);
R_API int r_meta_space_count_for(RAnal *a, const RSpace *space_name);
R_API RList *r_meta_enumerate(RAnal *a, int type);