diff options
author | Pedro Alves <pedro@palves.net> | 2021-01-11 18:52:12 +0000 |
---|---|---|
committer | Pedro Alves <pedro@palves.net> | 2021-02-03 01:15:05 +0000 |
commit | 9147506842aaedfa90e89dd7f4913a990dbf947d (patch) | |
tree | 3940a4648e610afba45c04ff8ab5113e104c66db /gdb | |
parent | d758e62c0ecca0c26547cfe40aa1f32d6e8464b7 (diff) | |
download | gdb-9147506842aaedfa90e89dd7f4913a990dbf947d.zip gdb-9147506842aaedfa90e89dd7f4913a990dbf947d.tar.gz gdb-9147506842aaedfa90e89dd7f4913a990dbf947d.tar.bz2 |
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.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | 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 <pedro@palves.net> + * infrun.c (prepare_for_detach): Don't release scoped_restore + before returning. + +2021-02-03 Pedro Alves <pedro@palves.net> + * 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. |