Skip to content

Commit

Permalink
helper/command: simplify exec_command()
Browse files Browse the repository at this point in the history
The jimtcl interpreter guarantees that the Jim objects in argv[]
are not deallocated during the command execution. Thus, there is
no need to copy the string content of argv[].

Simplify exec_command() by inlining its two sub-functions and
dropping the strdup().

While there, add a LOG_ERROR() for out of memory.

Change-Id: I3e21ed7da50ca0bd072edbd49fca9740c81f95b0
Signed-off-by: Antonio Borneo <[email protected]>
Reviewed-on: https://review.openocd.org/c/openocd/+/8055
Tested-by: jenkins
  • Loading branch information
borneoa committed Jan 13, 2024
1 parent 712c124 commit f9ea9ce
Showing 1 changed file with 9 additions and 29 deletions.
38 changes: 9 additions & 29 deletions src/helper/command.c
Original file line number Diff line number Diff line change
Expand Up @@ -154,30 +154,6 @@ static void script_debug(Jim_Interp *interp, unsigned int argc, Jim_Obj * const
free(dbg);
}

static void script_command_args_free(char **words, unsigned nwords)
{
for (unsigned i = 0; i < nwords; i++)
free(words[i]);
free(words);
}

static char **script_command_args_alloc(unsigned int argc, Jim_Obj * const *argv)
{
char **words = malloc(argc * sizeof(char *));
if (!words)
return NULL;

for (unsigned int i = 0; i < argc; i++) {
const char *w = Jim_GetString(argv[i], NULL);
words[i] = strdup(w);
if (!words[i]) {
script_command_args_free(words, i);
return NULL;
}
}
return words;
}

struct command_context *current_command_context(Jim_Interp *interp)
{
/* grab the command context from the associated data */
Expand Down Expand Up @@ -898,13 +874,17 @@ static int exec_command(Jim_Interp *interp, struct command_context *cmd_ctx,
return c->jim_handler(interp, argc, argv);

/* use c->handler */
unsigned int nwords = argc;
char **words = script_command_args_alloc(argc, argv);
if (!words)
const char **words = malloc(argc * sizeof(char *));
if (!words) {
LOG_ERROR("Out of memory");
return JIM_ERR;
}

int retval = run_command(cmd_ctx, c, (const char **)words, nwords);
script_command_args_free(words, nwords);
for (int i = 0; i < argc; i++)
words[i] = Jim_GetString(argv[i], NULL);

int retval = run_command(cmd_ctx, c, words, argc);
free(words);
return command_retval_set(interp, retval);
}

Expand Down

0 comments on commit f9ea9ce

Please sign in to comment.