summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDarren Tucker <dtucker@zip.com.au>2016-10-19 03:26:09 +1100
committerDarren Tucker <dtucker@zip.com.au>2016-10-19 03:26:09 +1100
commit8f866d8a57b9a2dc5dd04504e27f593b551618e3 (patch)
tree06f7dcbec815809281ebcca61c006644536f404b
parentf901440cc844062c9bab0183d133f7ccc58ac3a5 (diff)
Import readpassphrase.c rev 1.26.
Author: miller@openbsd.org: Avoid generate SIGTTOU when restoring the terminal mode. If we get SIGTTOU it means the process is not in the foreground process group which, in most cases, means that the shell has taken control of the tty. Requiring the user the fg the process in this case doesn't make sense and can result in both SIGTSTP and SIGTTOU being sent which can lead to the process being suspended again immediately after being brought into the foreground.
-rw-r--r--openbsd-compat/readpassphrase.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/openbsd-compat/readpassphrase.c b/openbsd-compat/readpassphrase.c
index 783cc9e67..24aed6e46 100644
--- a/openbsd-compat/readpassphrase.c
+++ b/openbsd-compat/readpassphrase.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: readpassphrase.c,v 1.25 2015/09/14 10:45:27 guenther Exp $ */ 1/* $OpenBSD: readpassphrase.c,v 1.26 2016/10/18 12:47:18 millert Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 2000-2002, 2007, 2010 4 * Copyright (c) 2000-2002, 2007, 2010
@@ -157,9 +157,13 @@ restart:
157 157
158 /* Restore old terminal settings and signals. */ 158 /* Restore old terminal settings and signals. */
159 if (memcmp(&term, &oterm, sizeof(term)) != 0) { 159 if (memcmp(&term, &oterm, sizeof(term)) != 0) {
160 const int sigttou = signo[SIGTTOU];
161
162 /* Ignore SIGTTOU generated when we are not the fg pgrp. */
160 while (tcsetattr(input, TCSAFLUSH|TCSASOFT, &oterm) == -1 && 163 while (tcsetattr(input, TCSAFLUSH|TCSASOFT, &oterm) == -1 &&
161 errno == EINTR && !signo[SIGTTOU]) 164 errno == EINTR && !signo[SIGTTOU])
162 continue; 165 continue;
166 signo[SIGTTOU] = sigttou;
163 } 167 }
164 (void)sigaction(SIGALRM, &savealrm, NULL); 168 (void)sigaction(SIGALRM, &savealrm, NULL);
165 (void)sigaction(SIGHUP, &savehup, NULL); 169 (void)sigaction(SIGHUP, &savehup, NULL);