From 9147506842aaedfa90e89dd7f4913a990dbf947d Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Mon, 11 Jan 2021 18:52:12 +0000 Subject: prepare_for_detach: don't release scoped_restore at the end After detaching from a process, the inf->detaching flag is inadvertently left set to true. If you afterwards reuse the same inferior to start a new process, GDB will mishave... The problem is that prepare_for_detach discards the scoped_restore at the end, while the intention is for the flag to be set only for the duration of prepare_for_detach. This was already a bug in the original commit that added prepare_for_detach, commit 24291992dac3 ("PR gdb/11321"), by yours truly. Back then, we still used cleanups, and the function called discard_cleanups instead of do_cleanups, by mistake. gdb/ChangeLog: * infrun.c (prepare_for_detach): Don't release scoped_restore before returning. --- gdb/ChangeLog | 5 +++++ gdb/infrun.c | 7 +------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 920df3e..256b9d0 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,10 @@ 2021-02-03 Pedro Alves + * infrun.c (prepare_for_detach): Don't release scoped_restore + before returning. + +2021-02-03 Pedro Alves + * infrun.c (handle_one): New function, factored out from ... (stop_all_threads): ... here. diff --git a/gdb/infrun.c b/gdb/infrun.c index 51d60f4..895f474 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -3607,13 +3607,8 @@ prepare_for_detach (void) at this point, and signals are passed directly to the inferior, so this must mean the process is gone. */ if (!ecs->wait_some_more) - { - restore_detaching.release (); - error (_("Program exited while detaching")); - } + error (_("Program exited while detaching")); } - - restore_detaching.release (); } /* Wait for control to return from inferior to debugger. -- cgit v1.1