From f9654cd7b24ba97583b7c39564ab28e9595a12d9 Mon Sep 17 00:00:00 2001 From: djm Date: Tue, 22 Jan 2002 12:05:31 +0000 Subject: [PATCH] - djm@cvs.openbsd.org 2001/12/21 08:53:45 [readpass.c] Avoid interruptable passphrase read; ok markus@ --- ChangeLog | 3 +++ readpass.c | 21 +++++++++++++++------ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 88114f09..74551d43 100644 --- a/ChangeLog +++ b/ChangeLog @@ -13,6 +13,9 @@ - djm@cvs.openbsd.org 2001/12/21 08:52:22 [ssh-keygen.1 ssh-keygen.c] Remove default (rsa1) key type; ok markus@ + - djm@cvs.openbsd.org 2001/12/21 08:53:45 + [readpass.c] + Avoid interruptable passphrase read; ok markus@ 20020121 - (djm) Rework ssh-rand-helper: diff --git a/readpass.c b/readpass.c index a0429818..7e13828b 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)); -- 2.45.2