]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commit
[gdb] Handle ^C during disassembly
authorTom de Vries <tdevries@suse.de>
Thu, 8 Aug 2024 21:52:00 +0000 (23:52 +0200)
committerTom de Vries <tdevries@suse.de>
Thu, 8 Aug 2024 21:52:00 +0000 (23:52 +0200)
commitc45c3b4162148077765e94fd17d4481f18d6d44c
tree44d21a529dbe4bcee20f4fdf53a721a23096a03f
parent5b84cbc35ad574483781e62b7fddbcbf73cf2ad3
[gdb] Handle ^C during disassembly

In PR gdb/32025, a fatal error was reported when sending a SIGINT to gdb while
disassembling.

I managed to reproduce this on aarch64-linux in a Leap 15.5 container using
this trigger patch:
...
 gdb_disassembler_memory_reader::dis_asm_read_memory
   (bfd_vma memaddr, gdb_byte *myaddr, unsigned int len,
    struct disassemble_info *info) noexcept
 {
+  set_quit_flag ();
   return target_read_code (memaddr, myaddr, len);
 }
...
and a simple gdb command line calling the disassemble command:
...
$ gdb -q -batch a.out -ex "disassemble main"
...

The following scenario leads to the fatal error:
- the disassemble command is executed,
- set_quit_flag is called in
  gdb_disassembler_memory_reader::dis_asm_read_memory, pretending that a
  user pressed ^C,
- target_read_code calls QUIT, which throws a
  gdb_exception_quit,
- the exception propagation mechanism reaches c code in libopcodes and a fatal
  error triggers because the c code is not compiled with -fexception.

Fix this by:
- wrapping the body of gdb_disassembler_memory_reader::dis_asm_read_memory in
  catch_exceptions (which consequently needs moving to a header file), and
- reraising the caught exception in default_print_insn using QUIT.

Tested on aarch64-linux.

Approved-By: Andrew Burgess <aburgess@redhat.com>
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32025
gdb/arch-utils.c
gdb/disasm.c
gdb/event-top.h
gdb/gdb_bfd.c