From f2050afd732e7461fdb31971b77e000eda943ee4 Mon Sep 17 00:00:00 2001 From: liona24 Date: Tue, 11 Oct 2022 17:56:15 +0200 Subject: [PATCH] Explicitly close the remote session (#896) * Explicitly close the remote session * Add regression test * Styling fixes --- gef.py | 10 +++++----- tests/regressions/gdbserver_connection.py | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 5 deletions(-) create mode 100644 tests/regressions/gdbserver_connection.py diff --git a/gef.py b/gef.py index 407c724fc..988c2f31b 100644 --- a/gef.py +++ b/gef.py @@ -3506,8 +3506,8 @@ def exit_handler(_: "gdb.ExitedEvent") -> None: reset_all_caches() gef.session.qemu_mode = False if gef.session.remote: - # make sure the tempdir is trashed - del(gef.session.remote) + gef.session.remote.close() + del gef.session.remote gef.session.remote = None return @@ -9964,13 +9964,13 @@ def tmux_setup(self) -> None: forcing the context to be redirected there.""" tmux = which("tmux") ok("tmux session found, splitting window...") - + pane, pty = subprocess.check_output([tmux, "splitw", "-h", '-F#{session_name}:#{window_index}.#{pane_index}-#{pane_tty}', "-P"]).decode().strip().split("-") atexit.register(lambda : subprocess.run([tmux, "kill-pane", "-t", pane])) # clear the screen and let it wait for input forever gdb.execute(f"! {tmux} send-keys -t {pane} 'clear ; cat' C-m") gdb.execute(f"! {tmux} select-pane -L") - + ok(f"Setting `context.redirect` to '{pty}'...") gdb.execute(f"gef config context.redirect {pty}") ok("Done!") @@ -10536,7 +10536,7 @@ def __init__(self, host: str, port: int, pid: int =-1, qemu: Optional[pathlib.Pa raise EnvironmentError(f"Failed to create a proper environment for {self.target}") return - def __del__(self) -> None: + def close(self) -> None: self.__local_root_fd.cleanup() try: gef_on_new_unhook(self.remote_objfile_event_handler) diff --git a/tests/regressions/gdbserver_connection.py b/tests/regressions/gdbserver_connection.py new file mode 100644 index 000000000..da3784581 --- /dev/null +++ b/tests/regressions/gdbserver_connection.py @@ -0,0 +1,15 @@ +from tests.utils import ( + GefUnitTestGeneric, + gdb_run_cmd, + gdbserver_session, +) + + +class RegressionGdbserverConnection(GefUnitTestGeneric): + def test_can_establish_connection_to_gdbserver_again_after_disconnect(self): + """Ensure that gdb can connect to a gdbserver again after disconnecting (PR #896).""" + + with gdbserver_session(port=5001) as _, gdbserver_session(port=5002) as _: + buf = gdb_run_cmd("gef-remote 127.0.0.1 5001", + after=["detach", "gef-remote 127.0.0.1 5002", "continue"]) + self.assertNoException(buf)