aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarc Schink <openocd-dev@marcschink.de>2018-01-10 12:45:52 +0100
committerTomas Vanek <vanekt@fbl.cz>2018-01-17 07:52:35 +0000
commitedb67962865d5d3cc4a8ec1790b4c8c5327e98fd (patch)
treec6dec5a569c13307bfc85b33498cdf3d631ba51d /src
parent2bd78e12392f99ffed0b9fd815000f5bcfd3db14 (diff)
downloadriscv-openocd-edb67962865d5d3cc4a8ec1790b4c8c5327e98fd.zip
riscv-openocd-edb67962865d5d3cc4a8ec1790b4c8c5327e98fd.tar.gz
riscv-openocd-edb67962865d5d3cc4a8ec1790b4c8c5327e98fd.tar.bz2
Fix Jim interpreter memory leak
Change-Id: I71d7d97e7dc315c42fc43b65cb5fcecd7bdfb581 Signed-off-by: Marc Schink <openocd-dev@marcschink.de> Reviewed-on: http://openocd.zylin.com/2959 Tested-by: jenkins Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
Diffstat (limited to 'src')
-rw-r--r--src/helper/command.c9
-rw-r--r--src/helper/command.h8
-rw-r--r--src/openocd.c4
3 files changed, 19 insertions, 2 deletions
diff --git a/src/helper/command.c b/src/helper/command.c
index 40e8b05..cbd52fb 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 bd24156..f696ab8 100644
--- a/src/helper/command.h
+++ b/src/helper/command.h
@@ -308,6 +308,14 @@ struct command_context *current_command_context(Jim_Interp *interp);
*/
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
* affect all shared contexts. The caller must track reference counting
diff --git a/src/openocd.c b/src/openocd.c
index 83329b5..831bd17 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();