From d619c6039f60058d5514f5595881696f8762d565 Mon Sep 17 00:00:00 2001 From: pancake Date: Mon, 23 Jan 2017 22:42:27 +0100 Subject: [PATCH] Fix undefined behaviour in pd with emustr --- libr/cons/cons.c | 10 +++++++--- libr/core/disasm.c | 15 ++++++++------- libr/include/r_cons.h | 2 +- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/libr/cons/cons.c b/libr/cons/cons.c index 0dd4c3f15f..456e132079 100644 --- a/libr/cons/cons.c +++ b/libr/cons/cons.c @@ -1196,15 +1196,19 @@ R_API void r_cons_highlight (const char *word) { } } -R_API char *r_cons_lastline () { - char *b = I.buffer+I.buffer_len; - while (b >I.buffer) { +R_API char *r_cons_lastline (int *len) { + char *b = I.buffer + I.buffer_len; + while (b > I.buffer) { if (*b == '\n') { b++; break; } b--; } + if (len) { + int delta = b - I.buffer; + *len = I.buffer_len - delta; + } return b; } diff --git a/libr/core/disasm.c b/libr/core/disasm.c index 7c6f6c6aa9..b54b0b0778 100644 --- a/libr/core/disasm.c +++ b/libr/core/disasm.c @@ -2397,9 +2397,9 @@ static void ds_print_core_vmode(RDisasmState *ds) { static void ds_align_comment(RDisasmState *ds) { const int cmtcol = ds->cmtcol; if (ds->show_comment_right_default) { - char *ll = r_cons_lastline (); + int cstrlen = 0; + char *ll = r_cons_lastline (&cstrlen); if (ll) { - int cstrlen = strlen (ll); int cols, ansilen = r_str_ansi_len (ll); int utf8len = r_utf8_strlen ((const ut8*)ll); int cells = utf8len - (cstrlen - ansilen); @@ -2766,8 +2766,8 @@ static void ds_print_relocs(RDisasmState *ds) { if (rel) { const int cmtcol = ds->cmtcol; - char *ll = r_cons_lastline (); - int cstrlen = strlen (ll); + int cstrlen = 0; + char *ll = r_cons_lastline (&cstrlen); int ansilen = r_str_ansi_len (ll); int utf8len = r_utf8_strlen ((const ut8*)ll); int cells = utf8len - (cstrlen - ansilen); @@ -2941,11 +2941,12 @@ static void print_fcn_arg(RCore *core, const char *type, const char *name, static void delete_last_comment(RDisasmState *ds) { if (ds->show_comment_right_default) { - char *ll = r_cons_lastline (); + int len = 0; + char *ll = r_cons_lastline (&len); if (ll) { - char * begin = strstr (ll, "; "); + char *begin = strnstr (ll, "; ", len); if (begin) { - int cstrlen = strlen (ll); + const int cstrlen = strlen (ll); r_cons_drop (cstrlen - (int)(begin - ll)); } } diff --git a/libr/include/r_cons.h b/libr/include/r_cons.h index 44d5e2749c..5c83835219 100644 --- a/libr/include/r_cons.h +++ b/libr/include/r_cons.h @@ -427,7 +427,7 @@ R_API void r_cons_canvas_fill(RConsCanvas *c, int x, int y, int w, int h, char c R_API RCons *r_cons_new (void); R_API RCons *r_cons_singleton (void); R_API RCons *r_cons_free (void); -R_API char *r_cons_lastline (void); +R_API char *r_cons_lastline (int *size); typedef void (*RConsBreak)(void *); R_API void r_cons_break_end(void);