Fix oob read crash in prl

This commit is contained in:
pancake 2015-03-23 01:09:35 +01:00
parent 1a73f5e807
commit 2361d43034
2 changed files with 34 additions and 12 deletions

View File

@ -1103,6 +1103,20 @@ static int cmd_print_pxA(RCore *core, int len, const char *data) {
return R_TRUE;
}
static void printraw (RCore *core, int len, int mode) {
int obsz = core->blocksize;
int restore_obsz = 0;
if (len != obsz) {
if (!r_core_block_size (core, len))
len = core->blocksize;
else restore_obsz = 1;
}
r_print_raw (core->print, core->offset, core->block, len, mode);
if (restore_obsz) {
(void)r_core_block_size (core, obsz);
}
}
static int cmd_print(void *data, const char *input) {
RCore *core = (RCore *)data;
int mode, w, p, i, l, len, total[10];
@ -2031,17 +2045,11 @@ static int cmd_print(void *data, const char *input) {
case 'r': // "pr"
switch (input[1]) {
case '?':
r_cons_printf ("|Usage: prl/prx [size]\n");
r_cons_printf ("|Usage: pr[glx] [size]\n");
r_cons_printf ("| prl: print raw with lines offsets\n");
r_cons_printf ("| prx: printable chars with real offset (hyew)\n");
r_cons_printf ("| prg: print raw gunzipped block\n");
break;
case 'l': // "prl"
r_print_raw (core->print, core->offset, core->block, len, 1);
break;
case 'x': // "prx"
r_print_raw (core->print, core->offset, core->block, len, 2);
break;
case 'g': // "prg" // gunzip
{
int sz, outlen = 0;
@ -2055,8 +2063,16 @@ static int cmd_print(void *data, const char *input) {
free (out);
}
break;
/* TODO: compact */
case 'l': // "prl"
printraw (core, len, 1);
break;
case 'x': // "prx"
printraw (core, len, 2);
break;
default:
r_print_raw (core->print, core->offset, core->block, len, 0);
printraw (core, len, 0);
break;
}
break;
case '3': // "p3" [file]

View File

@ -821,19 +821,25 @@ R_API void r_print_raw(RPrint *p, ut64 addr, const ut8* buf, int len, int offlin
}
} else if (offlines) {
const ut8 *o, *q;
int mustbreak = 0, linenum = 1;
int i, mustbreak = 0, linenum = 1;
o = q = buf;
i = 0;
do {
p->printf ("%d 0x%08x ", linenum,
addr + (int)(size_t)(q-buf));
for (;*q && *q != '\n'; q++);
if (!*q)
for (; i<len && *q && *q != '\n'; q++, i++) {
// just loop
}
if ((i+1)>=len || !*q)
mustbreak = 1;
p->write (o, (int)(size_t)(q-o));
if ((q-o)>0) {
p->write (o, (int)(size_t)(q-o));
}
p->printf ("\n");
linenum++;
o = ++q;
i++;
} while (!mustbreak);
} else {
p->write (buf, len);