From 15463008105521a972bd27446a3ad2c2c40c34f3 Mon Sep 17 00:00:00 2001 From: pancake Date: Tue, 12 Apr 2022 23:44:06 +0200 Subject: [PATCH] Handle ^C in fg and improve ^C in pd ##shell --- libr/cons/cons.c | 17 +++++++++++++++++ libr/core/canal.c | 1 + libr/core/cmd_flag.c | 22 ++++++++++++++++++---- libr/core/disasm.c | 2 +- 4 files changed, 37 insertions(+), 5 deletions(-) diff --git a/libr/cons/cons.c b/libr/cons/cons.c index 908055957b..fd205cc756 100644 --- a/libr/cons/cons.c +++ b/libr/cons/cons.c @@ -389,10 +389,27 @@ R_API void r_cons_context_break_pop(RConsContext *context, bool sig) { } } +#if RADARE2_5_7_X + +// ABI break +R_API void r_cons_break_push(void) { + r_cons_context_break_push (C, NULL, NULL, true); +} + +R_API void r_cons_break_popa(void) { + while (!r_stack_is_empty (C->break_stack)) { + r_cons_context_break_pop (); + } +} + +#else + R_API void r_cons_break_push(RConsBreak cb, void *user) { r_cons_context_break_push (C, cb, user, true); } +#endif + R_API void r_cons_break_pop(void) { r_cons_context_break_pop (C, true); } diff --git a/libr/core/canal.c b/libr/core/canal.c index 610cd22f21..d91cf4a294 100644 --- a/libr/core/canal.c +++ b/libr/core/canal.c @@ -4742,6 +4742,7 @@ R_API void r_core_anal_fcn_merge(RCore *core, ut64 addr, ut64 addr2) { static bool esil_anal_stop = false; static void cccb(void *u) { esil_anal_stop = true; + r_cons_context_break (NULL); eprintf ("^C\n"); } diff --git a/libr/core/cmd_flag.c b/libr/core/cmd_flag.c index 1b30a3f793..89c833fc05 100644 --- a/libr/core/cmd_flag.c +++ b/libr/core/cmd_flag.c @@ -185,18 +185,21 @@ static RList *__childrenFlagsOf(RCore *core, RList *flags, const char *prefix) { const size_t prefix_len = strlen (prefix); r_list_foreach (flags, iter, f) { + if (r_cons_is_breaked ()) { + break; + } if (prefix_len > 0 && strncmp (f->name, prefix, prefix_len)) { continue; } if (prefix_len > strlen (f->name)) { continue; } - if (r_cons_is_breaked ()) { - break; - } const char *name = f->name; int name_len = strlen (name); r_list_foreach (flags, iter2, f2) { + if (r_cons_is_breaked ()) { + break; + } if (prefix_len > strlen (f2->name)) { continue; } @@ -224,6 +227,9 @@ static RList *__childrenFlagsOf(RCore *core, RList *flags, const char *prefix) { const char *fname = NULL; size_t fname_len = 0; r_list_foreach (flags, iter2, f2) { + if (r_cons_is_breaked ()) { + break; + } if (strncmp (f2->name, kw, kw_len)) { continue; } @@ -248,6 +254,9 @@ static RList *__childrenFlagsOf(RCore *core, RList *flags, const char *prefix) { bool found = false; r_list_foreach (list, iter2, fn) { + if (r_cons_is_breaked ()) { + break; + } if (!strcmp (fn, kw)) { found = true; break; @@ -281,6 +290,9 @@ static void __printRecursive(RCore *core, RList *flags, const char *prefix, int } RList *children = __childrenFlagsOf (core, flags, prefix); r_list_foreach (children, iter, fn) { + if (r_cons_is_breaked ()) { + break; + } if (!strcmp (fn, prefix)) { continue; } @@ -291,7 +303,7 @@ static void __printRecursive(RCore *core, RList *flags, const char *prefix, int r_cons_printf ("%s %s\n", r_str_pad (' ', prefix_len), fn + prefix_len); } //r_cons_printf (".fg %s\n", fn); - __printRecursive (core, flags, fn, mode, depth+1); + __printRecursive (core, flags, fn, mode, depth + 1); } r_list_free (children); } @@ -299,7 +311,9 @@ static void __printRecursive(RCore *core, RList *flags, const char *prefix, int static void __flag_graph(RCore *core, const char *input, int mode) { RList *flags = r_list_newf (NULL); r_flag_foreach_space (core->flags, r_flag_space_cur (core->flags), listFlag, flags); + r_cons_break_push (NULL, NULL); __printRecursive (core, flags, input, mode, 0); + r_cons_break_pop (); r_list_free (flags); } diff --git a/libr/core/disasm.c b/libr/core/disasm.c index ee349178e8..e899d3afd9 100644 --- a/libr/core/disasm.c +++ b/libr/core/disasm.c @@ -5560,7 +5560,7 @@ toro: ds->at = ds->addr + ds->index; ds->vat = r_core_pava (core, ds->at); - if (r_cons_is_breaked ()) { + if (r_cons_is_breaked () || r_cons_was_breaked ()) { R_FREE (nbuf); if (ds->pj) { r_cons_pop ();