qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] gdbstub: Fix handle_query_xfer_auxv


From: Alex Bennée
Subject: Re: [PATCH] gdbstub: Fix handle_query_xfer_auxv
Date: Thu, 28 Jan 2021 21:21:54 +0000
User-agent: mu4e 1.5.7; emacs 28.0.50

Richard Henderson <richard.henderson@linaro.org> writes:

> The main problem was that we were treating a guest address
> as a host address with a mere cast.
>
> Use the correct interface for accessing guest memory.  Do not
> allow offset == auxv_len, which would result in an empty packet.
>
> Fixes: 51c623b0de1 ("gdbstub: add support to Xfer:auxv:read: packet")
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>
> Fixes a number of check-tcg failures, which are transformed from
> proper failures to "SKIP: PC not set" by the test harness (bug?).
> But the qemu executable has in fact crashed.

I wonder if I can tighten that up to detect the failed remote end in the
scripts.

Anyway snarfed into my queue. Thanks!

>
> I'm embarrased to note that I reviewed the original patch, and
> should have noticed this.
>
>
> r~
>
> ---
>  gdbstub.c | 17 ++++++++++++-----
>  1 file changed, 12 insertions(+), 5 deletions(-)
>
> diff --git a/gdbstub.c b/gdbstub.c
> index c7ca7e9f88..759bb00bcf 100644
> --- a/gdbstub.c
> +++ b/gdbstub.c
> @@ -2245,7 +2245,6 @@ static void handle_query_xfer_auxv(GdbCmdContext 
> *gdb_ctx, void *user_ctx)
>  {
>      TaskState *ts;
>      unsigned long offset, len, saved_auxv, auxv_len;
> -    const char *mem;
>  
>      if (gdb_ctx->num_params < 2) {
>          put_packet("E22");
> @@ -2257,8 +2256,8 @@ static void handle_query_xfer_auxv(GdbCmdContext 
> *gdb_ctx, void *user_ctx)
>      ts = gdbserver_state.c_cpu->opaque;
>      saved_auxv = ts->info->saved_auxv;
>      auxv_len = ts->info->auxv_len;
> -    mem = (const char *)(saved_auxv + offset);
> -    if (offset > auxv_len) {
> +
> +    if (offset >= auxv_len) {
>          put_packet("E00");
>          return;
>      }
> @@ -2269,12 +2268,20 @@ static void handle_query_xfer_auxv(GdbCmdContext 
> *gdb_ctx, void *user_ctx)
>  
>      if (len < auxv_len - offset) {
>          g_string_assign(gdbserver_state.str_buf, "m");
> -        memtox(gdbserver_state.str_buf, mem, len);
>      } else {
>          g_string_assign(gdbserver_state.str_buf, "l");
> -        memtox(gdbserver_state.str_buf, mem, auxv_len - offset);
> +        len = auxv_len - offset;
>      }
>  
> +    g_byte_array_set_size(gdbserver_state.mem_buf, len);
> +    if (target_memory_rw_debug(gdbserver_state.g_cpu, saved_auxv + offset,
> +                               gdbserver_state.mem_buf->data, len, false)) {
> +        put_packet("E14");
> +        return;
> +    }
> +
> +    memtox(gdbserver_state.str_buf,
> +           (const char *)gdbserver_state.mem_buf->data, len);
>      put_packet_binary(gdbserver_state.str_buf->str,
>                        gdbserver_state.str_buf->len, true);
>  }


-- 
Alex Bennée



reply via email to

[Prev in Thread] Current Thread [Next in Thread]