mirror of
https://github.com/radareorg/radare2.git
synced 2025-03-06 13:29:46 +00:00
Fixes #133660: Dword in the middle
This commit is contained in:
parent
b02c8b7caf
commit
7f11846a38
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user