]> git.sur5r.net Git - openocd/commitdiff
Fix Jim interpreter memory leak
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 40e8b05827f1b506fd9d0cb0188482e8dc55f0ae..cbd52fbf13fe61a4d41a145454b61410e4c3dee8 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 bd24156e31af1d27d9ff7af8329d7be11b7bc89d..f696ab823bc16811623ee4b3e34325c83850f91a 100644 (file)
@@ -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
index 83329b519233c48b9857157932aaf34e8ecb237d..831bd17f2a64282b99c9920f00af8a9e44cc680f 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();