helper/command: fix memory leak on malloc() fail
[openocd.git] / src / helper / command.c
index 630630f3884dd7f7b48973e38b0dd500bcf6cf1f..08d14b47fe5f2a803c1703098513035e1724e056 100644 (file)
@@ -51,7 +51,7 @@ struct log_capture_state {
 
 static int unregister_command(struct command_context *context,
        const char *cmd_prefix, const char *name);
-static int command_unknown(Jim_Interp *interp, int argc, Jim_Obj * const *argv);
+static int jim_command_dispatch(Jim_Interp *interp, int argc, Jim_Obj * const *argv);
 static int help_add_command(struct command_context *cmd_ctx,
        const char *cmd_name, const char *help_text, const char *usage_text);
 static int help_del_command(struct command_context *cmd_ctx, const char *cmd_name);
@@ -64,7 +64,7 @@ static inline bool jimcmd_is_proc(Jim_Cmd *cmd)
 
 static inline bool jimcmd_is_ocd_command(Jim_Cmd *cmd)
 {
-       return !cmd->isproc && cmd->u.native.cmdProc == command_unknown;
+       return !cmd->isproc && cmd->u.native.cmdProc == jim_command_dispatch;
 }
 
 static inline void *jimcmd_privdata(Jim_Cmd *cmd)
@@ -83,17 +83,21 @@ static struct log_capture_state *command_log_capture_start(Jim_Interp *interp)
 {
        /* capture log output and return it. A garbage collect can
         * happen, so we need a reference count to this object */
-       Jim_Obj *tclOutput = Jim_NewStringObj(interp, "", 0);
-       if (NULL == tclOutput)
+       Jim_Obj *jim_output = Jim_NewStringObj(interp, "", 0);
+       if (!jim_output)
                return NULL;
 
+       Jim_IncrRefCount(jim_output);
+
        struct log_capture_state *state = malloc(sizeof(*state));
-       if (NULL == state)
+       if (!state) {
+               LOG_ERROR("Out of memory");
+               Jim_DecrRefCount(interp, jim_output);
                return NULL;
+       }
 
        state->interp = interp;
-       Jim_IncrRefCount(tclOutput);
-       state->output = tclOutput;
+       state->output = jim_output;
 
        log_add_callback(tcl_output, state);
 
@@ -180,7 +184,7 @@ extern struct command_context *global_cmd_ctx;
 
 /* dump a single line to the log for the command.
  * Do nothing in case we are not at debug level 3 */
-void script_debug(Jim_Interp *interp, unsigned int argc, Jim_Obj * const *argv)
+static void script_debug(Jim_Interp *interp, unsigned int argc, Jim_Obj * const *argv)
 {
        if (debug_level < LOG_LVL_DEBUG)
                return;
@@ -340,7 +344,7 @@ static struct command *register_command(struct command_context *context,
 
        LOG_DEBUG("registering '%s'...", full_name);
        int retval = Jim_CreateCommand(context->interp, full_name,
-                               command_unknown, c, command_free);
+                               jim_command_dispatch, c, command_free);
        if (retval != JIM_OK) {
                command_run_linef(context, "del_help_text {%s}", full_name);
                command_run_linef(context, "del_usage_text {%s}", full_name);
@@ -437,7 +441,11 @@ int unregister_commands_match(struct command_context *cmd_ctx, const char *forma
                        continue;
                }
                LOG_DEBUG("delete command \"%s\"", name);
+#if JIM_VERSION >= 80
                Jim_DeleteCommand(interp, elem);
+#else
+               Jim_DeleteCommand(interp, name);
+#endif
 
                help_del_command(cmd_ctx, name);
 
@@ -942,7 +950,7 @@ static int exec_command(Jim_Interp *interp, struct command_context *cmd_ctx,
        return command_retval_set(interp, retval);
 }
 
-static int command_unknown(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
+static int jim_command_dispatch(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
 {
        script_debug(interp, argc, argv);
 
@@ -982,7 +990,7 @@ static int command_unknown(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
         * current_target_override is used also for event handlers
         * therefore we prevent touching it if command has no prefix.
         * Previous override is saved and restored back to ensure
-        * correct work when command_unknown() is re-entered.
+        * correct work when jim_command_dispatch() is re-entered.
         */
        struct target *saved_target_override = cmd_ctx->current_target_override;
        if (c->jim_override_target)

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)