Fix varsub build (fix inter-module dependency issue) and catch overflow

This commit is contained in:
pancake 2014-12-14 02:10:55 +01:00
parent cace7101e5
commit b7a8af83dc
3 changed files with 19 additions and 6 deletions

View File

@ -742,6 +742,7 @@ R_API int r_core_init(RCore *core) {
core->anal->printf = (void *) r_cons_printf;
core->parser = r_parse_new ();
core->parser->anal = core->anal;
core->parser->varlist = r_anal_var_list;
r_parse_set_user_ptr (core->parser, core);
core->bin = r_bin_new ();
core->bin->printf = (PrintfCallback) r_cons_printf;

View File

@ -17,6 +17,8 @@ extern "C" {
R_LIB_VERSION_HEADER(r_parse);
typedef RList* (*RAnalVarList)(RAnal *anal, RAnalFunction *fcn, int kind);
typedef struct r_parse_t {
void *user;
int flagspace;
@ -24,6 +26,7 @@ typedef struct r_parse_t {
struct r_parse_plugin_t *cur;
RAnal *anal; // weak anal ref
RList *parsers;
RAnalVarList varlist;
} RParse;
typedef struct r_parse_plugin_t {

View File

@ -164,7 +164,6 @@ static inline int issegoff (const char *w) {
#endif
static int varsub(RParse *p, RAnalFunction *f, char *data, char *str, int len) {
// strncpy (str, data, len);
#if USE_VARSUBS
int i;
char *ptr, *ptr2;
@ -179,13 +178,18 @@ static int varsub(RParse *p, RAnalFunction *f, char *data, char *str, int len) {
}
return R_TRUE;
#else
RList *vars = r_anal_var_list (p->anal, f, 'v');
RList *args = r_anal_var_list (p->anal, f, 'a');
r_list_join (vars, args);
RAnalVar *var;
RListIter *iter;
char oldstr[64], newstr[64];
char *tstr = strdup (data);
RList *vars, *args;
if (!p->varlist)
return R_FALSE;
vars = p->varlist (p->anal, f, 'v');
args = p->varlist (p->anal, f, 'a');
r_list_join (vars, args);
r_list_foreach (vars, iter, var) {
snprintf (oldstr, sizeof (oldstr)-1, "[%s - 0x%x]",
p->anal->reg->name[R_REG_NAME_BP],
@ -198,8 +202,13 @@ static int varsub(RParse *p, RAnalFunction *f, char *data, char *str, int len) {
break;
}
}
strncpy (str, tstr, strlen(tstr));
str[strlen (tstr)] = 0;
if (len > strlen (tstr)) {
strncpy (str, tstr, strlen(tstr));
str[strlen (tstr)] = 0;
} else {
// TOO BIG STRING CANNOT REPLACE HERE
}
free (tstr);
return R_TRUE;
#endif
}