From: Simon Marchi <simon.marchi@polymtl.ca>
To: gdb-patches@sourceware.org
Cc: Simon Marchi <simon.marchi@polymtl.ca>
Subject: [PATCH 3/3] Avoid GDB SIGTTOU on catch exec + set follow-exec-mode new (PR 23368)
Date: Tue, 16 Oct 2018 03:38:00 -0000 [thread overview]
Message-ID: <20181016033835.17594-3-simon.marchi@polymtl.ca> (raw)
In-Reply-To: <20181016033835.17594-1-simon.marchi@polymtl.ca>
Here's a summary of PR 23368:
#include <unistd.h>
int main (void)
{
char *exec_args[] = { "/bin/ls", NULL };
execve (exec_args[0], exec_args, NULL);
}
$ gdb -nx t -ex "catch exec" -ex "set follow-exec-mode new" -ex run
...
[1] + 13146 suspended (tty output) gdb -q -nx t -ex "catch exec" -ex "set follow-exec-mode new" -ex run
$
Here's what happens: when the inferior execs with "follow-exec-mode
new", we first "mourn" it before creating the new one. This ends up
calling inflow_inferior_exit, which sets the per-inferior terminal state
to "is_ours":
inf->terminal_state = target_terminal_state::is_ours;
At this point, the inferior's terminal_state is is_ours, while the
"reality", tracked by gdb_tty_state, is is_inferior (GDB doesn't own the
terminal).
Later, we continue processing the exec inferior event and decide we want
to stop (because of the "catch exec") and call target_terminal::ours to
make sure we own the terminal. However, we don't actually go to the
target backend to change the settings, because the core thinks that no
inferior owns the terminal (inf->terminal_state is
target_terminal_state::is_ours, as checked in
target_terminal_is_ours_kind, for both inferiors). When something in
readline tries to mess with the terminal settings, it generates a
SIGTTOU.
This patch manages to fix this particular case by calling
target_terminal::ours() in inflow_inferior_exit. This makes so that
inflow actually changes the terminal settings so that GDB owns it, which
avoids the SIGTTOU later.
The buildbot doesn't complain, but I am not sure this is the most
bestest way to fix this, maybe it's just papering over the actual
problem or introduces some latent bug. In particular, I am not sure if
this is correct in case we have multiple inferiors sharing the same
terminal. But I thought I would still submit this patch to get the ball
rolling.
gdb/ChangeLog:
PR gdb/23368
* inflow.c (inflow_inferior_exit): Update doc. Call
target_terminal::ours.
---
gdb/inflow.c | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/gdb/inflow.c b/gdb/inflow.c
index e355f4aa9fc5..95e195167ef7 100644
--- a/gdb/inflow.c
+++ b/gdb/inflow.c
@@ -653,18 +653,15 @@ get_inflow_inferior_data (struct inferior *inf)
return info;
}
-/* This is a "inferior_exit" observer. Releases the TERMINAL_INFO member
- of the inferior structure. This field is private to inflow.c, and
- its type is opaque to the rest of GDB. PID is the target pid of
- the inferior that is about to be removed from the inferior
- list. */
+/* This is a "inferior_exit" observer. Releases the terminal info associated
+ to INF. */
static void
inflow_inferior_exit (struct inferior *inf)
{
struct terminal_info *info;
- inf->terminal_state = target_terminal_state::is_ours;
+ target_terminal::ours ();
info = (struct terminal_info *) inferior_data (inf, inflow_inferior_data);
if (info != NULL)
--
2.19.1
next prev parent reply other threads:[~2018-10-16 3:38 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-10-16 3:38 [PATCH 1/3] Pass inferior to terminal_save_inferior Simon Marchi
2018-10-16 3:38 ` [PATCH 2/3] Pass inferior to terminal_inferior Simon Marchi
2018-10-22 20:54 ` Pedro Alves
2018-10-23 9:14 ` Simon Marchi
2018-10-16 3:38 ` Simon Marchi [this message]
[not found] ` <37bde004-853a-3ccc-3777-03cc43b36147@redhat.com>
2018-10-20 15:14 ` [PATCH 3/3] Avoid GDB SIGTTOU on catch exec + set follow-exec-mode new (PR 23368) Simon Marchi
2018-10-20 15:38 ` Simon Marchi
2018-10-22 20:56 ` Pedro Alves
2018-10-23 9:49 ` Simon Marchi
2018-10-23 10:55 ` Pedro Alves
[not found] ` <mvmftwvr8ao.fsf@suse.de>
2018-10-24 14:08 ` Simon Marchi
2018-10-22 20:54 ` [PATCH 1/3] Pass inferior to terminal_save_inferior Pedro Alves
2018-10-23 9:01 ` Simon Marchi
2018-10-23 11:11 ` Pedro Alves
2018-10-23 20:56 ` Simon Marchi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20181016033835.17594-3-simon.marchi@polymtl.ca \
--to=simon.marchi@polymtl.ca \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox