From f731dff227ff92e302ee5d402e94603ef20efbe8 Mon Sep 17 00:00:00 2001 From: pancake Date: Thu, 27 Jun 2024 15:53:50 +0200 Subject: [PATCH] Fix appending redirection on internal alias files ##shell --- libr/core/cmd.c | 7 ++----- libr/core/cmd_api.c | 26 ++++++++++++-------------- test/db/cmd/cmd_pipe | 25 +++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 19 deletions(-) diff --git a/libr/core/cmd.c b/libr/core/cmd.c index de1cdd840c72e..d0d518f628203 100644 --- a/libr/core/cmd.c +++ b/libr/core/cmd.c @@ -2179,7 +2179,7 @@ static int cmd_table(void *data, const char *input) { if (*file == '$' && !file[1]) { R_LOG_ERROR ("No alias name given"); } else if (*file == '$') { - RCmdAliasVal *file_data = r_cmd_alias_get (core->rcmd, file+1); + RCmdAliasVal *file_data = r_cmd_alias_get (core->rcmd, file + 1); if (file_data) { char *file_data_str = r_cmd_alias_val_strdup (file_data); load_table (core, core->table, strdup (file_data_str)); @@ -4568,11 +4568,8 @@ repeat:; ut8 *alias_data = r_buf_read_all (cmd_out, &alias_len); const char *arg = r_str_trim_head_ro (str + 1); if (appendResult) { - if (r_cmd_alias_append_raw (core->rcmd, arg, alias_data, alias_len)) { + if (!r_cmd_alias_append_raw (core->rcmd, arg, alias_data, alias_len)) { R_LOG_INFO ("Alias '$%s' is a command - will not attempt to append", arg); - } else { - /* No existing alias */ - r_cmd_alias_set_raw (core->rcmd, arg, alias_data, alias_len); } } else { r_cmd_alias_set_raw (core->rcmd, arg, alias_data, alias_len); diff --git a/libr/core/cmd_api.c b/libr/core/cmd_api.c index 1c3b3529d4fe8..564bf48a5d421 100644 --- a/libr/core/cmd_api.c +++ b/libr/core/cmd_api.c @@ -1,4 +1,4 @@ -/* radare - LGPL - Copyright 2009-2023 - pancake */ +/* radare - LGPL - Copyright 2009-2024 - pancake */ #define R_LOG_ORIGIN "cmdapi" #include @@ -366,16 +366,13 @@ R_API RCmdAliasVal *r_cmd_alias_get(RCmd *cmd, const char *k) { } static ut8 *alias_append_internal(int *out_szp, const RCmdAliasVal *first, const ut8 *second, int second_sz) { - ut8* out; - int out_sz; - /* If appending to a string, always overwrite the trailing \0 */ - int bytes_from_first = first->is_str + const int bytes_from_first = first->is_str ? first->sz - 1 : first->sz; - out_sz = bytes_from_first + second_sz; - out = malloc (out_sz); + const int out_sz = bytes_from_first + second_sz; + ut8 *out = malloc (out_sz); if (!out) { return NULL; } @@ -383,7 +380,7 @@ static ut8 *alias_append_internal(int *out_szp, const RCmdAliasVal *first, const /* Copy full buffer if raw bytes. Stop before \0 if string. */ memcpy (out, first->data, bytes_from_first); /* Always copy all bytes from second, including trailing \0 */ - memcpy (out+bytes_from_first, second, second_sz); + memcpy (out + bytes_from_first, second, second_sz); if (out_sz) { *out_szp = out_sz; @@ -392,6 +389,7 @@ static ut8 *alias_append_internal(int *out_szp, const RCmdAliasVal *first, const } R_API int r_cmd_alias_append_str(RCmd *cmd, const char *k, const char *a) { + R_RETURN_VAL_IF_FAIL (cmd && k && a, 1); RCmdAliasVal *v_old = r_cmd_alias_get (cmd, k); if (v_old) { if (!v_old->is_data) { @@ -410,23 +408,23 @@ R_API int r_cmd_alias_append_str(RCmd *cmd, const char *k, const char *a) { return 0; } +// R2_600 - return bool instead R_API int r_cmd_alias_append_raw(RCmd *cmd, const char *k, const ut8 *a, int sz) { RCmdAliasVal *v_old = r_cmd_alias_get (cmd, k); if (v_old) { if (!v_old->is_data) { - return 1; + return 0; } int new_len = 0; ut8 *new = alias_append_internal (&new_len, v_old, a, sz); - if (!new) { - return 1; + if (new) { + r_cmd_alias_set_raw (cmd, k, new, new_len); + free (new); } - r_cmd_alias_set_raw (cmd, k, new, new_len); - free (new); } else { r_cmd_alias_set_raw (cmd, k, a, sz); } - return 0; + return true; } /* Returns a new copy of v->data. If !v->is_str, hex escaped */ diff --git a/test/db/cmd/cmd_pipe b/test/db/cmd/cmd_pipe index 3cc51a5d4c3f1..4eca6894a6157 100644 --- a/test/db/cmd/cmd_pipe +++ b/test/db/cmd/cmd_pipe @@ -43,3 +43,28 @@ Disassembly of entry0: EOF RUN + +NAME=double redirect into an alias +FILE=-- +CMDS=< $a +echo world > $a +cat $a +EOF +EXPECT=< $a +echo world >> $a +cat $a +EOF +EXPECT=<