Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
gdbstub: clean-up vcont handling to avoid goto
We can handle all the error exit cases by using g_autofree() for the
one thing that needs cleaning up on the exit.

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20230630180423.558337-31-alex.bennee@linaro.org>
  • Loading branch information
stsquad committed Jul 3, 2023
1 parent 3b72d68 commit 2261b73
Showing 1 changed file with 9 additions and 19 deletions.
28 changes: 9 additions & 19 deletions gdbstub/gdbstub.c
Expand Up @@ -573,15 +573,14 @@ static int gdb_handle_vcont(const char *p)
{
int res, signal = 0;
char cur_action;
char *newstates;
unsigned long tmp;
uint32_t pid, tid;
GDBProcess *process;
CPUState *cpu;
GDBThreadIdKind kind;
unsigned int max_cpus = gdb_get_max_cpus();
/* uninitialised CPUs stay 0 */
newstates = g_new0(char, max_cpus);
g_autofree char *newstates = g_new0(char, max_cpus);

/* mark valid CPUs with 1 */
CPU_FOREACH(cpu) {
Expand All @@ -597,22 +596,20 @@ static int gdb_handle_vcont(const char *p)
res = 0;
while (*p) {
if (*p++ != ';') {
res = -ENOTSUP;
goto out;
return -ENOTSUP;
}

cur_action = *p++;
if (cur_action == 'C' || cur_action == 'S') {
cur_action = qemu_tolower(cur_action);
res = qemu_strtoul(p, &p, 16, &tmp);
if (res) {
goto out;
return res;
}
signal = gdb_signal_to_target(tmp);
} else if (cur_action != 'c' && cur_action != 's') {
/* unknown/invalid/unsupported command */
res = -ENOTSUP;
goto out;
return -ENOTSUP;
}

if (*p == '\0' || *p == ';') {
Expand All @@ -625,14 +622,12 @@ static int gdb_handle_vcont(const char *p)
} else if (*p++ == ':') {
kind = read_thread_id(p, &p, &pid, &tid);
} else {
res = -ENOTSUP;
goto out;
return -ENOTSUP;
}

switch (kind) {
case GDB_READ_THREAD_ERR:
res = -EINVAL;
goto out;
return -EINVAL;

case GDB_ALL_PROCESSES:
cpu = gdb_first_attached_cpu();
Expand All @@ -649,8 +644,7 @@ static int gdb_handle_vcont(const char *p)
process = gdb_get_process(pid);

if (!process->attached) {
res = -EINVAL;
goto out;
return -EINVAL;
}

cpu = get_first_cpu_in_process(process);
Expand All @@ -668,8 +662,7 @@ static int gdb_handle_vcont(const char *p)

/* invalid CPU/thread specified */
if (!cpu) {
res = -EINVAL;
goto out;
return -EINVAL;
}

/* only use if no previous match occourred */
Expand All @@ -679,12 +672,9 @@ static int gdb_handle_vcont(const char *p)
break;
}
}

gdbserver_state.signal = signal;
gdb_continue_partial(newstates);

out:
g_free(newstates);

return res;
}

Expand Down

0 comments on commit 2261b73

Please sign in to comment.