This patch prevents command handlers from modifying the strings passed
in the 'args' array.

Signed-off-by: Zachary T Welch <z...@superlucidity.net>
---
 src/helper/command.c |   10 ++++++----
 src/helper/command.h |    2 +-
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/src/helper/command.c b/src/helper/command.c
index 25755d8..45f5747 100644
--- a/src/helper/command.c
+++ b/src/helper/command.c
@@ -48,7 +48,7 @@ int fast_and_dangerous = 0;
 Jim_Interp *interp = NULL;
 
 static int run_command(command_context_t *context,
-               command_t *c, char *words[], unsigned num_words);
+               command_t *c, const char *words[], unsigned num_words);
 
 static void tcl_output(void *privData, const char *file, unsigned line,
                const char *function, const char *string)
@@ -141,7 +141,7 @@ static int script_command(Jim_Interp *interp, int argc, 
Jim_Obj *const *argv)
 
        log_add_callback(tcl_output, tclOutput);
 
-       retval = run_command(context, c, words, nwords);
+       retval = run_command(context, c, (const char **)words, nwords);
 
        log_remove_callback(tcl_output, tclOutput);
 
@@ -407,7 +407,7 @@ void command_print(command_context_t *context, const char 
*format, ...)
 }
 
 static int run_command(command_context_t *context,
-               command_t *c, char *words[], unsigned num_words)
+               command_t *c, const char *words[], unsigned num_words)
 {
        int start_word = 0;
        if (!((context->mode == COMMAND_CONFIG) || (c->mode == COMMAND_ANY) || 
(c->mode == context->mode)))
@@ -417,7 +417,9 @@ static int run_command(command_context_t *context,
                return ERROR_FAIL;
        }
 
-       int retval = c->handler(context, c->name, words + start_word + 1, 
num_words - start_word - 1);
+       unsigned argc = num_words - start_word - 1;
+       const char **args = words + start_word + 1;
+       int retval = c->handler(context, c->name, args, argc);
        if (retval == ERROR_COMMAND_SYNTAX_ERROR)
        {
                /* Print help for command */
diff --git a/src/helper/command.h b/src/helper/command.h
index 3f462ff..260d9a1 100644
--- a/src/helper/command.h
+++ b/src/helper/command.h
@@ -88,7 +88,7 @@ typedef struct command_context_s
  */
 #define __COMMAND_HANDLER(name, extra...) \
                int name(struct command_context_s *cmd_ctx, \
-                               const char *cmd, char **args, unsigned argc, 
##extra)
+                               const char *cmd, const char *args[], unsigned 
argc, ##extra)
 
 /**
  * Use this to macro to call a command helper (or a nested handler).
-- 
1.6.4.4

_______________________________________________
Openocd-development mailing list
Openocd-development@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to