From 03aa69b2611746927f4f47adade84263cc5e69f7 Mon Sep 17 00:00:00 2001 From: pancake Date: Tue, 9 Jun 2015 01:45:39 +0200 Subject: [PATCH] Implement reverse rap for system() --- libr/core/core.c | 8 ++++++- libr/core/graph.c | 4 ++-- libr/include/r_io.h | 7 +++--- libr/io/io.c | 7 ++++-- libr/io/p/io_rap.c | 45 ++++++++++++++++++++++++++++++++++--- media/images/r2emoji.png | Bin 0 -> 2921 bytes media/images/r2sticker.png | Bin 0 -> 17593 bytes 7 files changed, 60 insertions(+), 11 deletions(-) create mode 100644 media/images/r2emoji.png create mode 100644 media/images/r2sticker.png diff --git a/libr/core/core.c b/libr/core/core.c index 0a3e170de2..c80c04b1b9 100644 --- a/libr/core/core.c +++ b/libr/core/core.c @@ -89,6 +89,11 @@ static int core_cmd_callback (void *user, const char *cmd) { return r_core_cmd0 (core, cmd); } +static char *core_cmdstr_callback (void *user, const char *cmd) { + RCore *core = (RCore *)user; + return r_core_cmd_str (core, cmd); +} + static ut64 getref (RCore *core, int n, char t, int type) { RAnalFunction *fcn = r_anal_get_fcn_in (core->anal, core->offset, 0); RListIter *iter; @@ -884,7 +889,8 @@ R_API int r_core_init(RCore *core) { core->io = r_io_new (); core->io->ff = 1; core->io->user = (void *)core; - core->io->core_cmd_cb = core_cmd_callback; + core->io->cb_core_cmd = core_cmd_callback; + core->io->cb_core_cmdstr = core_cmdstr_callback; core->sign = r_sign_new (); core->search = r_search_new (R_SEARCH_KEYWORD); r_io_undo_enable (core->io, 1, 0); // TODO: configurable via eval diff --git a/libr/core/graph.c b/libr/core/graph.c index 55a5355342..bf8648d88c 100644 --- a/libr/core/graph.c +++ b/libr/core/graph.c @@ -874,8 +874,8 @@ R_API int r_core_visual_graph(RCore *core, RAnalFunction *_fcn) { " TAB - select previous node\n" " t/f - follow true/false edges\n" " e - toggle edge-lines style (diagonal/square)\n" - " n - toggle mini-graph\n" " O - toggle disasm mode\n" + " p - toggle mini-graph\n" " u - select previous node\n" " V - toggle basicblock / call graphs\n" " x/X - jump to xref/ref\n" @@ -957,7 +957,7 @@ R_API int r_core_visual_graph(RCore *core, RAnalFunction *_fcn) { case 'e': can->linemode = !!!can->linemode; break; - case 'n': + case 'p': graph_toggle_small_nodes(g); break; case 'u': diff --git a/libr/include/r_io.h b/libr/include/r_io.h index 3c098c5e44..3719ba146e 100644 --- a/libr/include/r_io.h +++ b/libr/include/r_io.h @@ -140,14 +140,15 @@ typedef struct r_io_t { RList *files; RList *cache; int zeromap; - //XXX: Need by rap - void *user; - int (*core_cmd_cb)(void *user, const char *str); RCache *buffer; int buffer_enabled; int ff; int autofd; char *runprofile; + /* Core Callbacks (used by rap) */ + void *user; + int (*cb_core_cmd)(void *user, const char *str); + char* (*cb_core_cmdstr)(void *user, const char *str); } RIO; typedef struct r_io_plugin_t { diff --git a/libr/io/io.c b/libr/io/io.c index 4bb19ea526..92073f2f69 100644 --- a/libr/io/io.c +++ b/libr/io/io.c @@ -1,4 +1,4 @@ -/* radare - LGPL - Copyright 2008-2014 - pancake */ +/* radare - LGPL - Copyright 2008-2015 - pancake */ #include "r_io.h" #include "r_util.h" @@ -931,6 +931,9 @@ static ut8 * r_io_desc_read (RIO *io, RIODesc * desc, ut64 *out_sz) { off = io->off; if (*out_sz == UT64_MAX) return buf; + if (*out_sz > 0xffffff) { + return buf; + } buf = malloc (*out_sz); @@ -938,7 +941,7 @@ static ut8 * r_io_desc_read (RIO *io, RIODesc * desc, ut64 *out_sz) { if (!buf || !desc->plugin->read (io, desc, buf, *out_sz)) { free (buf); io->off = off; - return R_FALSE; + return NULL; } } io->off = off; diff --git a/libr/io/p/io_rap.c b/libr/io/p/io_rap.c index 15ef1bf735..42ac950a4d 100644 --- a/libr/io/p/io_rap.c +++ b/libr/io/p/io_rap.c @@ -1,4 +1,4 @@ -/* radare - LGPL - Copyright 2011-2014 - pancake */ +/* radare - LGPL - Copyright 2011-2015 - pancake */ // TODO: implement the rap API in r_socket ? #include "r_io.h" @@ -269,9 +269,44 @@ static int rap__system(RIO *io, RIODesc *fd, const char *command) { r_socket_write (s, buf, i+5); r_socket_flush (s); + /* read reverse cmds */ + for (;;) { + ret = r_socket_read_block (s, buf, 1); + if (ret != 1) { + return -1; + } + /* system back in the middle */ + /* TODO: all pkt handlers should check for reverse queries */ + if (buf[0] == RMT_SYSTEM) { + char *res, *str; + ut32 reslen = 0, cmdlen = 0; + // run io->cmdstr + // return back the string + buf[0] |= RMT_REPLY; + ret = r_socket_read_block (s, buf+1, 4); + r_mem_copyendian ((ut8*)&cmdlen, buf+1, 4, ENDIAN); + if (cmdlen+1==0) // check overflow + cmdlen = 0; + str = calloc (1, cmdlen+1); + ret = r_socket_read_block (s, (ut8*)str, cmdlen); + //eprintf ("RUN CMD(%s)\n", str); + res = io->cb_core_cmdstr (io->user, str); + reslen = strlen (res); + free (str); + r_mem_copyendian ((ut8*)buf+1, (const ut8*)&reslen, + sizeof(ut32), ENDIAN); + free (res); + memcpy (buf+5, res, reslen); + r_socket_write (s, buf, 5+reslen); + r_socket_flush (s); + } else { + break; + } + } + // read - ret = r_socket_read_block (s, buf, 5); - if (ret != 5) + ret = r_socket_read_block (s, buf+1, 4); + if (ret != 4) return -1; if (buf[0] != (op | RMT_REPLY)) { eprintf ("Unexpected system reply\n"); @@ -280,6 +315,10 @@ static int rap__system(RIO *io, RIODesc *fd, const char *command) { r_mem_copyendian ((ut8*)&i, buf+1, 4, ENDIAN); ret = 0; + if (i>0xffff) { + eprintf ("Invalid length\n"); + return -1; + } ptr = (char *)malloc (i+1); if (ptr) { int ir; diff --git a/media/images/r2emoji.png b/media/images/r2emoji.png new file mode 100644 index 0000000000000000000000000000000000000000..a6cc6eb3b02d5ac527bf08cd2e8b1c6adf0026d8 GIT binary patch literal 2921 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 literal 0 HcmV?d00001