diff options
author | oharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60> | 2008-11-11 14:47:01 +0000 |
---|---|---|
committer | oharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60> | 2008-11-11 14:47:01 +0000 |
commit | ded28546f84eb39a8a89994ddc7b026a460d6381 (patch) | |
tree | a7bcb624567d1e27485b623e688d6d538e116cde | |
parent | 1360ae4487a6ea47a02951674c74749419406a76 (diff) | |
download | riscv-openocd-ded28546f84eb39a8a89994ddc7b026a460d6381.zip riscv-openocd-ded28546f84eb39a8a89994ddc7b026a460d6381.tar.gz riscv-openocd-ded28546f84eb39a8a89994ddc7b026a460d6381.tar.bz2 |
Fixes (more or less) random SEGFAULT upon invoking script_command().
git-svn-id: svn://svn.berlios.de/openocd/trunk@1156 b42882b7-edfa-0310-969c-e2dbd0fdcd60
-rw-r--r-- | src/helper/command.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/src/helper/command.c b/src/helper/command.c index d47203c..9ca64dd 100644 --- a/src/helper/command.c +++ b/src/helper/command.c @@ -64,7 +64,6 @@ static void tcl_output(void *privData, const char *file, int line, const char *f extern command_context_t *global_cmd_ctx; - static int script_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { /* the private data is stashed in the interp structure */ @@ -75,10 +74,20 @@ static int script_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv) int nwords; char **words; + /* DANGER!!!! be careful what we invoke here, since interp->cmdPrivData might + * get overwritten by running other Jim commands! Treat it as an + * emphemeral global variable that is used in lieu of an argument + * to the fn and fish it out manually. + */ + c = interp->cmdPrivData; + if (c==NULL) + { + LOG_ERROR("BUG: interp->cmdPrivData==NULL"); + return JIM_ERR; + } target_call_timer_callbacks_now(); LOG_USER_N("%s", ""); /* Keep GDB connection alive*/ - c = interp->cmdPrivData; LOG_DEBUG("script_command - %s", c->name); words = malloc(sizeof(char *) * argc); |