diff options
author | 2019-12-06 03:06:08 +0000 | |
---|---|---|
committer | 2019-12-06 03:06:08 +0000 | |
commit | e396b6beaf40ded7e546d32ec30d230990e881ea (patch) | |
tree | 8c4e492826a0cc6f9d9d485c171c5d77164a2d60 /usr.bin/ssh/readpass.c | |
parent | bring the __func__ (diff) | |
download | wireguard-openbsd-e396b6beaf40ded7e546d32ec30d230990e881ea.tar.xz wireguard-openbsd-e396b6beaf40ded7e546d32ec30d230990e881ea.zip |
fix setting of $SSH_ASKPASS_PROMPT - it shouldn't be set when asking
passphrases, only when confirming the use of a key (i.e. for ssh-agent
keys added with "ssh-add -c keyfile")
Diffstat (limited to 'usr.bin/ssh/readpass.c')
-rw-r--r-- | usr.bin/ssh/readpass.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/usr.bin/ssh/readpass.c b/usr.bin/ssh/readpass.c index ad70ca13bde..96468416ad8 100644 --- a/usr.bin/ssh/readpass.c +++ b/usr.bin/ssh/readpass.c @@ -1,4 +1,4 @@ -/* $OpenBSD: readpass.c,v 1.59 2019/12/06 02:55:21 djm Exp $ */ +/* $OpenBSD: readpass.c,v 1.60 2019/12/06 03:06:08 djm Exp $ */ /* * Copyright (c) 2001 Markus Friedl. All rights reserved. * @@ -45,7 +45,7 @@ #include "uidswap.h" static char * -ssh_askpass(char *askpass, const char *msg) +ssh_askpass(char *askpass, const char *msg, const char *env_hint) { pid_t pid, ret; size_t len; @@ -72,7 +72,8 @@ ssh_askpass(char *askpass, const char *msg) close(p[0]); if (dup2(p[1], STDOUT_FILENO) == -1) fatal("%s: dup2: %s", __func__, strerror(errno)); - setenv("SSH_ASKPASS_PROMPT", "confirm", 1); /* hint to UI */ + if (env_hint != NULL) + setenv("SSH_ASKPASS_PROMPT", env_hint, 1); execlp(askpass, askpass, msg, (char *)NULL); fatal("%s: exec(%s): %s", __func__, askpass, strerror(errno)); } @@ -106,6 +107,9 @@ ssh_askpass(char *askpass, const char *msg) return pass; } +/* private/internal read_passphrase flags */ +#define RP_ASK_PERMISSION 0x8000 /* pass hint to askpass for confirm UI */ + /* * Reads a passphrase from /dev/tty with echo turned off/on. Returns the * passphrase (allocated with xmalloc). Exits if EOF is encountered. If @@ -117,6 +121,7 @@ read_passphrase(const char *prompt, int flags) { char cr = '\r', *askpass = NULL, *ret, buf[1024]; int rppflags, use_askpass = 0, ttyfd; + const char *askpass_hint = NULL; rppflags = (flags & RP_ECHO) ? RPP_ECHO_ON : RPP_ECHO_OFF; if (flags & RP_USE_ASKPASS) @@ -153,7 +158,9 @@ read_passphrase(const char *prompt, int flags) askpass = getenv(SSH_ASKPASS_ENV); else askpass = _PATH_SSH_ASKPASS_DEFAULT; - if ((ret = ssh_askpass(askpass, prompt)) == NULL) + if ((flags & RP_ASK_PERMISSION) != 0) + askpass_hint = "confirm"; + if ((ret = ssh_askpass(askpass, prompt, askpass_hint)) == NULL) if (!(flags & RP_ALLOW_EOF)) return xstrdup(""); return ret; @@ -181,7 +188,8 @@ ask_permission(const char *fmt, ...) vsnprintf(prompt, sizeof(prompt), fmt, args); va_end(args); - p = read_passphrase(prompt, RP_USE_ASKPASS|RP_ALLOW_EOF); + p = read_passphrase(prompt, + RP_USE_ASKPASS|RP_ALLOW_EOF|RP_ASK_PERMISSION); if (p != NULL) { /* * Accept empty responses and responses consisting |