diff options
author | dtucker <dtucker> | 2010-01-13 10:32:44 +0000 |
---|---|---|
committer | dtucker <dtucker> | 2010-01-13 10:32:44 +0000 |
commit | c9c73430ac92b477dda90865d9d5f407d8b4a69b (patch) | |
tree | caeb68d7b444147013a605292fe660f8beb6a64d /openbsd-compat/readpassphrase.c | |
parent | 8464feef7ee6b20556b9d1e783dda53576589868 (diff) | |
download | openssh-c9c73430ac92b477dda90865d9d5f407d8b4a69b.tar.gz |
- (dtucker) [openbsd-compat/readpassphrase.c] Update to OpenBSD's r1.22.
Fixes bz #1590, where sometimes you could not interrupt a connection while
ssh was prompting for a passphrase or password.
Diffstat (limited to 'openbsd-compat/readpassphrase.c')
-rw-r--r-- | openbsd-compat/readpassphrase.c | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/openbsd-compat/readpassphrase.c b/openbsd-compat/readpassphrase.c index 8b948635..62b6d0d8 100644 --- a/openbsd-compat/readpassphrase.c +++ b/openbsd-compat/readpassphrase.c @@ -1,4 +1,4 @@ -/* $OpenBSD: readpassphrase.c,v 1.21 2008/01/17 16:27:07 millert Exp $ */ +/* $OpenBSD: readpassphrase.c,v 1.22 2010/01/13 10:20:54 dtucker Exp $ */ /* * Copyright (c) 2000-2002, 2007 Todd C. Miller <Todd.Miller@courtesan.com> @@ -46,7 +46,7 @@ # define _POSIX_VDISABLE VDISABLE #endif -static volatile sig_atomic_t signo; +static volatile sig_atomic_t signo[_NSIG]; static void handler(int); @@ -54,7 +54,7 @@ char * readpassphrase(const char *prompt, char *buf, size_t bufsiz, int flags) { ssize_t nr; - int input, output, save_errno; + int input, output, save_errno, i, need_restart; char ch, *p, *end; struct termios term, oterm; struct sigaction sa, savealrm, saveint, savehup, savequit, saveterm; @@ -67,9 +67,11 @@ readpassphrase(const char *prompt, char *buf, size_t bufsiz, int flags) } restart: - signo = 0; + for (i = 0; i < _NSIG; i++) + signo[i] = 0; nr = -1; save_errno = 0; + need_restart = 0; /* * Read and write to /dev/tty if available. If not, read from * stdin and write to stderr unless a tty is required. @@ -120,7 +122,7 @@ restart: } /* No I/O if we are already backgrounded. */ - if (signo != SIGTTOU && signo != SIGTTIN) { + if (signo[SIGTTOU] != 1 && signo[SIGTTIN] != 1) { if (!(flags & RPP_STDIN)) (void)write(output, prompt, strlen(prompt)); end = buf + bufsiz - 1; @@ -166,15 +168,19 @@ restart: * If we were interrupted by a signal, resend it to ourselves * now that we have restored the signal handlers. */ - if (signo) { - kill(getpid(), signo); - switch (signo) { - case SIGTSTP: - case SIGTTIN: - case SIGTTOU: - goto restart; + for (i = 0; i < _NSIG; i++) { + if (signo[i]) { + kill(getpid(), i); + switch (i) { + case SIGTSTP: + case SIGTTIN: + case SIGTTOU: + need_restart = 1; + } } } + if (need_restart) + goto restart; if (save_errno) errno = save_errno; @@ -194,6 +200,6 @@ getpass(const char *prompt) static void handler(int s) { - signo = s; + signo[s] = 1; } #endif /* HAVE_READPASSPHRASE */ |