Fix Jim interpreter memory leak 59/2959/4
authorMarc Schink <openocd-dev@marcschink.de>
Wed, 10 Jan 2018 11:45:52 +0000 (12:45 +0100)
committerTomas Vanek <vanekt@fbl.cz>
Wed, 17 Jan 2018 07:52:35 +0000 (07:52 +0000)
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>
src/helper/command.c
src/helper/command.h
src/openocd.c

index 40e8b05..cbd52fb 100644 (file)
@@ -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)
index bd24156..f696ab8 100644 (file)
@@ -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
index 83329b5..831bd17 100644 (file)
@@ -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();