Fix jmptbl regression

This commit is contained in:
pancake 2016-05-30 15:30:55 +02:00
parent cd776862ef
commit e458901033
2 changed files with 31 additions and 27 deletions

View File

@ -233,18 +233,21 @@ static int try_walkthrough_jmptbl(RAnal *anal, RAnalFunction *fcn, int depth, ut
switch (sz) {
case 1: jmpptr = r_read_le8 (jmptbl + offs); break;
case 2: jmpptr = r_read_le16 (jmptbl + offs); break;
case 4: jmpptr = ptr + (st32) r_read_le32 (jmptbl + offs); break;
case 8: jmpptr = ptr + (st32) r_read_le32 (jmptbl + offs); break; // XXX
case 4: jmpptr = r_read_le32 (jmptbl + offs); break;
case 8: jmpptr = r_read_le32 (jmptbl + offs); break; // XXX
default: jmpptr = r_read_le64 (jmptbl + offs); break;
}
if (!anal->iob.is_valid_offset (anal->iob.io, jmpptr, 0)) {
jmpptr = ptr + (st32)jmpptr;
if (!anal->iob.is_valid_offset (anal->iob.io, jmpptr, 0)) {
break;
}
}
if (anal->limit) {
if (jmpptr < anal->limit->from || jmpptr > anal->limit->to) {
break;
}
}
if (!anal->iob.is_valid_offset (anal->iob.io, jmpptr, 0)) {
break;
}
// if (jmpptr < ip - MAX_JMPTBL_JMP || jmpptr > ip + MAX_JMPTBL_JMP) { break; }
recurseAt (jmpptr);
}

View File

@ -1,4 +1,4 @@
/* radare - LGPL - Copyright 2007-2015 - pancake & Skia */
/* radare - LGPL - Copyright 2007-2016 - pancake & Skia */
#include "r_cons.h"
#include "r_util.h"
@ -105,9 +105,9 @@ static void r_print_format_quadword(const RPrint* p, int endian, int mode,
if (!SEEVALUE) p->cb_printf (" ]");
}
} else if (MUSTSEEJSON) {
if (size==-1)
if (size==-1) {
p->cb_printf ("%"PFMT64d, addr64);
else {
} else {
p->cb_printf ("[ ");
while (size--) {
updateAddr (buf, i, endian, NULL, &addr64);
@ -115,10 +115,11 @@ static void r_print_format_quadword(const RPrint* p, int endian, int mode,
p->cb_printf ("%"PFMT64d, addr64);
if (elem == 0) elem = -2;
}
if (size != 0 && elem == -1)
if (size != 0 && elem == -1) {
p->cb_printf (", ");
}
if (elem > -1) elem--;
i+=8;
i += 8;
}
p->cb_printf (" ]");
}
@ -927,26 +928,26 @@ static void r_print_format_enum (const RPrint* p, ut64 seeki, char* fmtname,
static void r_print_format_register (const RPrint* p, int mode,
const char *name, const char* setval) {
RRegItem *ri = p->get_register (p->reg, name, R_REG_TYPE_ALL);
if (ri == NULL) {
if (ri) {
if (MUSTSET) {
p->cb_printf ("dr %s=%s\n", name, setval);
} else if (MUSTSEE) {
if (!SEEVALUE) p->cb_printf("%s : 0x%08"PFMT64x"\n", ri->name, p->get_register_value (p->reg, ri));
else p->cb_printf("0x%08"PFMT64x"\n", p->get_register_value (p->reg, ri));
} else if (MUSTSEEJSON) {
p->cb_printf ("%d}", p->get_register_value (p->reg, ri));
}
} else {
p->cb_printf ("Register %s does not exists\n", name);
return;
}
if (MUSTSET) {
p->cb_printf ("dr %s=%s\n", name, setval);
} else if (MUSTSEE) {
if (!SEEVALUE) p->cb_printf("%s : 0x%08"PFMT64x"\n", ri->name, p->get_register_value (p->reg, ri));
else p->cb_printf("0x%08"PFMT64x"\n", p->get_register_value (p->reg, ri));
} else if (MUSTSEEJSON) {
p->cb_printf ("%d}", p->get_register_value (p->reg, ri));
}
}
// XXX: this is very incomplete. must be updated to handle all format chars
int r_print_format_struct_size(const char *f, RPrint *p, int mode) {
char *o, *end, *args, *fmt;
int size = 0, tabsize=0, i, idx=0, biggest = 0;
int size = 0, tabsize = 0, i, idx = 0, biggest = 0;
if (!f) return -1;
o = strdup(f);
o = strdup (f);
if (!o) return -1;
end = strchr (o, ' ');
fmt = o;
@ -956,7 +957,7 @@ int r_print_format_struct_size(const char *f, RPrint *p, int mode) {
}
if (*end) {
*end = 0;
args = strdup (end+1);
args = strdup (end + 1);
} else {
args = strdup ("");
}
@ -1028,16 +1029,16 @@ int r_print_format_struct_size(const char *f, RPrint *p, int mode) {
{
const char *format = NULL;
char *endname = NULL, *structname = NULL;
structname = strdup(r_str_word_get0 (args, idx));
structname = strdup (r_str_word_get0 (args, idx));
if (*structname == '(') {
endname = strchr (structname, ')');
} else {
eprintf ("Struct name missing (%s)\n", structname);
free(structname);
free (structname);
break;
}
if (endname) *endname = '\0';
format = r_strht_get (p->formats, structname+1);
format = r_strht_get (p->formats, structname + 1);
free (structname);
size += tabsize * r_print_format_struct_size (format, p, mode);
}
@ -1061,7 +1062,7 @@ static int r_print_format_struct(RPrint* p, ut64 seek, const ut8* b, int len,
char *name, int slide, int mode, const char *setval, char *field) {
const char *fmt;
char namefmt[8];
if ((slide%STRUCTPTR) > NESTDEPTH || (slide%STRUCTFLAG)/STRUCTPTR > NESTDEPTH) {
if ((slide % STRUCTPTR) > NESTDEPTH || (slide%STRUCTFLAG)/STRUCTPTR > NESTDEPTH) {
eprintf ("Too much nested struct, recursion too deep...\n");
return 0;
}