From: oharboe Date: Tue, 11 Nov 2008 14:47:01 +0000 (+0000) Subject: Fixes (more or less) random SEGFAULT upon invoking script_command(). X-Git-Tag: v0.1.0~165 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=ded28546f84eb39a8a89994ddc7b026a460d6381;p=openocd 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 --- diff --git a/src/helper/command.c b/src/helper/command.c index d47203ca..9ca64dd2 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);