gdb/riscv: Fix oob memory access when printing info registers

Message ID 20230831112449.3822-1-ciaranwoodward@xmos.com
State Superseded
Headers
Series gdb/riscv: Fix oob memory access when printing info registers |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gdb_build--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_gdb_check--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_gdb_build--master-arm success Testing passed
linaro-tcwg-bot/tcwg_gdb_check--master-arm fail Patch failed to apply

Commit Message

Ciaran Woodward Aug. 31, 2023, 11:24 a.m. UTC
  If the length of a register name was greater than 15,
print_spaces was called with a negative number, which
prints random data from the heap instead of the requested
number of spaces.

This could happen if a target-description file was used
to specify additional long-named registers.

Fix is simple - don't ask for fewer than 1 space (since
we still want column separation).
---
 gdb/riscv-tdep.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
  

Comments

Kevin Buettner Aug. 31, 2023, 9:58 p.m. UTC | #1
On Thu, 31 Aug 2023 12:24:49 +0100
Ciaran Woodward <ciaranwoodward@xmos.com> wrote:

> If the length of a register name was greater than 15,
> print_spaces was called with a negative number, which
> prints random data from the heap instead of the requested
> number of spaces.
> 
> This could happen if a target-description file was used
> to specify additional long-named registers.
> 
> Fix is simple - don't ask for fewer than 1 space (since
> we still want column separation).
> ---
>  gdb/riscv-tdep.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/gdb/riscv-tdep.c b/gdb/riscv-tdep.c
> index ae18eb64452..0bae952156e 100644
> --- a/gdb/riscv-tdep.c
> +++ b/gdb/riscv-tdep.c
> @@ -1145,7 +1145,7 @@ riscv_print_one_register_info (struct gdbarch *gdbarch,
>    enum tab_stops { value_column_1 = 15 };
>  
>    gdb_puts (name, file);
> -  print_spaces (value_column_1 - strlen (name), file);
> +  print_spaces ( std::max<int>(1, value_column_1 - strlen (name)), file);

One small nit: the GDB coding standard requires a space between
the 'std::max<int>' and the left paren.

With that fixed, it's approved...

Approved-by: Kevin Buettner <kevinb@redhat.com>
  

Patch

diff --git a/gdb/riscv-tdep.c b/gdb/riscv-tdep.c
index ae18eb64452..0bae952156e 100644
--- a/gdb/riscv-tdep.c
+++ b/gdb/riscv-tdep.c
@@ -1145,7 +1145,7 @@  riscv_print_one_register_info (struct gdbarch *gdbarch,
   enum tab_stops { value_column_1 = 15 };
 
   gdb_puts (name, file);
-  print_spaces (value_column_1 - strlen (name), file);
+  print_spaces ( std::max<int>(1, value_column_1 - strlen (name)), file);
 
   try
     {