]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[gdb] Handle ^C in ~scoped_remote_fd
authorTom de Vries <tdevries@suse.de>
Tue, 24 Sep 2024 13:17:57 +0000 (15:17 +0200)
committerTom de Vries <tdevries@suse.de>
Tue, 24 Sep 2024 13:17:57 +0000 (15:17 +0200)
While reviewing "catch (...)" uses I came across:
...
try
  {
    fileio_error remote_errno;
    m_remote->remote_hostio_close (m_fd, &remote_errno);
  }
catch (...)
  {
    /* Swallow exception before it escapes the dtor.  If
       something goes wrong, likely the connection is gone,
       and there's nothing else that can be done.  */
  }
...

This also swallows gdb_exception_quit and gdb_exception_forced_quit.  I don't
know whether these can actually happen here, but if not it's better to
accommodate for the possibility anyway.

Fix this by handling gdb_exception_quit and gdb_exception_forced_quit
explicitly.

It could be that "catch (...)" should be replaced by
"catch (const gdb_exception &)" but that depends on what kind of exception
remote_hostio_close is expected to throw, and I don't know that, so I'm
leaving it as is.

Tested on aarch64-linux.

Approved-By: Tom Tromey <tom@tromey.com>
gdb/remote.c

index 3efb957542d8a43bb11c415ebfa3418dd8b31d18..8e704a770ce18d4cb2d57c8d370b80e41b132974 100644 (file)
@@ -13242,6 +13242,18 @@ public:
            fileio_error remote_errno;
            m_remote->remote_hostio_close (m_fd, &remote_errno);
          }
+       catch (const gdb_exception_quit &ex)
+         {
+           /* We can't throw from a destructor, so re-set the quit flag
+             for later QUIT checking.  */
+           set_quit_flag ();
+         }
+       catch (const gdb_exception_forced_quit &ex)
+         {
+           /* Like above, but (eventually) cause GDB to terminate by
+              setting sync_quit_force_run.  */
+           set_force_quit_flag ();
+         }
        catch (...)
          {
            /* Swallow exception before it escapes the dtor.  If