summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike FABIAN <mfabian@redhat.com>2011-06-07 13:42:00 +0200
committerEgbert Eich <eich@freedesktop.org>2013-01-08 09:53:30 -0500
commit473959141641b6779e6ff3c3c5b6ef326073bcd4 (patch)
tree228a04092ebfe11e956797bce2d5a500c0504aa5
parent9baee90bb4a81d439a7e2de13de190bf65936b4c (diff)
Set up terminal before fork.
After the fork it is undefined wether parent or child runs first. So there can be a race: if the child runs before the terminal of the parent is set up correctly luit may hang. This patch sets up the terminal before forking and undoes the settings in the child. Signed-off-by: Mike FABIAN <mfabian@redhat.com> Signed-off-by: Egbert Eich <eich@freedesktop.org>
-rw-r--r--luit.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/luit.c b/luit.c
index 0ece7b6..5cb3b8f 100644
--- a/luit.c
+++ b/luit.c
@@ -577,6 +577,8 @@ condom(int argc, char **argv)
IGNORE_RC(pipe(c2p_waitpipe));
}
+ setup_io(pty);
+
pid = fork();
if (pid < 0) {
perror("Couldn't fork");
@@ -584,6 +586,10 @@ condom(int argc, char **argv)
}
if (pid == 0) {
+#ifdef SIGWINCH
+ installHandler(SIGWINCH, SIG_DFL);
+#endif
+ installHandler(SIGCHLD, SIG_DFL);
close(pty);
if (pipe_option) {
close_waitpipe(1);
@@ -661,7 +667,6 @@ parent(int pid GCC_UNUSED, int pty)
if (verbose) {
reportIso2022(outputState);
}
- setup_io(pty);
if (pipe_option) {
write_waitpipe(p2c_waitpipe);