diff options
author | Damien Miller <djm@mindrot.org> | 2002-01-22 13:05:31 +0100 |
---|---|---|
committer | Damien Miller <djm@mindrot.org> | 2002-01-22 13:05:31 +0100 |
commit | f451e22e2134463062f7134f3e3556ab78ea0661 (patch) | |
tree | 60ad9ef0e5d187056937dd324f1b1cf18d9c6f6c /readpass.c | |
parent | - djm@cvs.openbsd.org 2001/12/21 08:52:22 (diff) | |
download | openssh-f451e22e2134463062f7134f3e3556ab78ea0661.tar.xz openssh-f451e22e2134463062f7134f3e3556ab78ea0661.zip |
- djm@cvs.openbsd.org 2001/12/21 08:53:45
[readpass.c]
Avoid interruptable passphrase read; ok markus@
Diffstat (limited to 'readpass.c')
-rw-r--r-- | readpass.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/readpass.c b/readpass.c index a0429818e..7e13828b7 100644 --- a/readpass.c +++ b/readpass.c @@ -32,7 +32,7 @@ */ #include "includes.h" -RCSID("$OpenBSD: readpass.c,v 1.23 2001/11/08 10:51:08 markus Exp $"); +RCSID("$OpenBSD: readpass.c,v 1.24 2001/12/21 08:53:45 djm Exp $"); #include "xmalloc.h" #include "readpass.h" @@ -46,7 +46,7 @@ ssh_askpass(char *askpass, const char *msg) pid_t pid; size_t len; char *pass; - int p[2], status; + int p[2], status, ret; char buf[1024]; if (fflush(stdout) != 0) @@ -71,14 +71,23 @@ ssh_askpass(char *askpass, const char *msg) fatal("ssh_askpass: exec(%s): %s", askpass, strerror(errno)); } close(p[1]); - len = read(p[0], buf, sizeof buf -1); + + len = ret = 0; + do { + ret = read(p[0], buf + len, sizeof(buf) - 1 - len); + if (ret == -1 && errno == EINTR) + continue; + if (ret <= 0) + break; + len += ret; + } while (sizeof(buf) - 1 - len > 0); + buf[len] = '\0'; + close(p[0]); while (waitpid(pid, &status, 0) < 0) if (errno != EINTR) break; - if (len <= 1) - return xstrdup(""); - buf[len] = '\0'; + buf[strcspn(buf, "\r\n")] = '\0'; pass = xstrdup(buf); memset(buf, 0, sizeof(buf)); |