jtag/tcl: fix memory leak in error return
[fw/openocd] / src / target / semihosting_common.c
index ce6a791717c5e866f254877de8a355078cd7fa85..9650556092bcbcdfb5e52251c8a6f0227908e31b 100644 (file)
@@ -145,7 +145,7 @@ int semihosting_common(struct target *target)
 {
        struct semihosting *semihosting = target->semihosting;
        if (!semihosting) {
-               /* Silently ignore if the semhosting field was not set. */
+               /* Silently ignore if the semihosting field was not set. */
                return ERROR_OK;
        }
 
@@ -345,7 +345,7 @@ int semihosting_common(struct target *target)
                                                        "semihosting: *** application exited normally ***\n");
                                        }
                                } else if (semihosting->param == ADP_STOPPED_RUN_TIME_ERROR) {
-                                       /* Chosen more or less arbitrarly to have a nicer message,
+                                       /* Chosen more or less arbitrarily to have a nicer message,
                                         * otherwise all other return the same exit code 1. */
                                        if (!gdb_actual_connections)
                                                exit(1);
@@ -944,6 +944,8 @@ int semihosting_common(struct target *target)
                                        uint8_t *fn1 = malloc(len1+1);
                                        uint8_t *fn2 = malloc(len2+1);
                                        if (!fn1 || !fn2) {
+                                               free(fn1);
+                                               free(fn2);
                                                semihosting->result = -1;
                                                semihosting->sys_errno = ENOMEM;
                                        } else {
@@ -1459,7 +1461,7 @@ static void semihosting_set_field(struct target *target, uint64_t value,
 /* -------------------------------------------------------------------------
  * Common semihosting commands handlers. */
 
-__COMMAND_HANDLER(handle_common_semihosting_command)
+static __COMMAND_HANDLER(handle_common_semihosting_command)
 {
        struct target *target = get_current_target(CMD_CTX);
 
@@ -1500,8 +1502,7 @@ __COMMAND_HANDLER(handle_common_semihosting_command)
        return ERROR_OK;
 }
 
-
-__COMMAND_HANDLER(handle_common_semihosting_fileio_command)
+static __COMMAND_HANDLER(handle_common_semihosting_fileio_command)
 {
        struct target *target = get_current_target(CMD_CTX);
 
@@ -1531,7 +1532,7 @@ __COMMAND_HANDLER(handle_common_semihosting_fileio_command)
        return ERROR_OK;
 }
 
-__COMMAND_HANDLER(handle_common_semihosting_cmdline)
+static __COMMAND_HANDLER(handle_common_semihosting_cmdline)
 {
        struct target *target = get_current_target(CMD_CTX);
        unsigned int i;
@@ -1564,7 +1565,7 @@ __COMMAND_HANDLER(handle_common_semihosting_cmdline)
        return ERROR_OK;
 }
 
-__COMMAND_HANDLER(handle_common_semihosting_resumable_exit_command)
+static __COMMAND_HANDLER(handle_common_semihosting_resumable_exit_command)
 {
        struct target *target = get_current_target(CMD_CTX);
 
@@ -1593,3 +1594,35 @@ __COMMAND_HANDLER(handle_common_semihosting_resumable_exit_command)
 
        return ERROR_OK;
 }
+
+const struct command_registration semihosting_common_handlers[] = {
+       {
+               "semihosting",
+               .handler = handle_common_semihosting_command,
+               .mode = COMMAND_EXEC,
+               .usage = "['enable'|'disable']",
+               .help = "activate support for semihosting operations",
+       },
+       {
+               "semihosting_cmdline",
+               .handler = handle_common_semihosting_cmdline,
+               .mode = COMMAND_EXEC,
+               .usage = "arguments",
+               .help = "command line arguments to be passed to program",
+       },
+       {
+               "semihosting_fileio",
+               .handler = handle_common_semihosting_fileio_command,
+               .mode = COMMAND_EXEC,
+               .usage = "['enable'|'disable']",
+               .help = "activate support for semihosting fileio operations",
+       },
+       {
+               "semihosting_resexit",
+               .handler = handle_common_semihosting_resumable_exit_command,
+               .mode = COMMAND_EXEC,
+               .usage = "['enable'|'disable']",
+               .help = "activate support for semihosting resumable exit",
+       },
+       COMMAND_REGISTRATION_DONE
+};