From edb67962865d5d3cc4a8ec1790b4c8c5327e98fd Mon Sep 17 00:00:00 2001 From: Marc Schink Date: Wed, 10 Jan 2018 12:45:52 +0100 Subject: [PATCH] Fix Jim interpreter memory leak Change-Id: I71d7d97e7dc315c42fc43b65cb5fcecd7bdfb581 Signed-off-by: Marc Schink Reviewed-on: http://openocd.zylin.com/2959 Tested-by: jenkins Reviewed-by: Tomas Vanek --- src/helper/command.c | 9 +++++++++ src/helper/command.h | 8 ++++++++ src/openocd.c | 4 ++-- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/helper/command.c b/src/helper/command.c index 40e8b058..cbd52fbf 100644 --- a/src/helper/command.c +++ b/src/helper/command.c @@ -1339,6 +1339,15 @@ struct command_context *command_init(const char *startup_tcl, Jim_Interp *interp return context; } +void command_exit(struct command_context *context) +{ + if (!context) + return; + + Jim_FreeInterp(context->interp); + command_done(context); +} + int command_context_mode(struct command_context *cmd_ctx, enum command_mode mode) { if (!cmd_ctx) diff --git a/src/helper/command.h b/src/helper/command.h index bd24156e..f696ab82 100644 --- a/src/helper/command.h +++ b/src/helper/command.h @@ -307,6 +307,14 @@ struct command_context *current_command_context(Jim_Interp *interp); * creates a command interpreter. */ struct command_context *command_init(const char *startup_tcl, Jim_Interp *interp); +/** + * Shutdown a command context. + * + * Free the command context and the associated Jim interpreter. + * + * @param context The command_context that will be destroyed. + */ +void command_exit(struct command_context *context); /** * Creates a copy of an existing command context. This does not create * a deep copy of the command list, so modifications in one context will diff --git a/src/openocd.c b/src/openocd.c index 83329b51..831bd17f 100644 --- a/src/openocd.c +++ b/src/openocd.c @@ -344,8 +344,8 @@ int openocd_main(int argc, char *argv[]) unregister_all_commands(cmd_ctx, NULL); - /* free commandline interface */ - command_done(cmd_ctx); + /* Shutdown commandline interface */ + command_exit(cmd_ctx); adapter_quit(); -- 2.39.5