OpenCoverage

readpass.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/openssh/src/readpass.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* $OpenBSD: readpass.c,v 1.52 2018/07/18 11:34:04 dtucker Exp $ */-
2/*-
3 * Copyright (c) 2001 Markus Friedl. All rights reserved.-
4 *-
5 * Redistribution and use in source and binary forms, with or without-
6 * modification, are permitted provided that the following conditions-
7 * are met:-
8 * 1. Redistributions of source code must retain the above copyright-
9 * notice, this list of conditions and the following disclaimer.-
10 * 2. Redistributions in binary form must reproduce the above copyright-
11 * notice, this list of conditions and the following disclaimer in the-
12 * documentation and/or other materials provided with the distribution.-
13 *-
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR-
15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES-
16 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.-
17 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,-
18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT-
19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,-
20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY-
21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT-
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF-
23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.-
24 */-
25-
26#include "includes.h"-
27-
28#include <sys/types.h>-
29#include <sys/wait.h>-
30-
31#include <errno.h>-
32#include <fcntl.h>-
33#ifdef HAVE_PATHS_H-
34# include <paths.h>-
35#endif-
36#include <signal.h>-
37#include <stdarg.h>-
38#include <stdio.h>-
39#include <stdlib.h>-
40#include <string.h>-
41#include <unistd.h>-
42-
43#include "xmalloc.h"-
44#include "misc.h"-
45#include "pathnames.h"-
46#include "log.h"-
47#include "ssh.h"-
48#include "uidswap.h"-
49-
50static char *-
51ssh_askpass(char *askpass, const char *msg)-
52{-
53 pid_t pid, ret;-
54 size_t len;-
55 char *pass;-
56 int p[2], status;-
57 char buf[1024];-
58 void (*osigchld)(int);-
59-
60 if (fflush(stdout) != 0)
fflush( stdout ) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
61 error("ssh_askpass: fflush: %s", strerror(errno));
never executed: error("ssh_askpass: fflush: %s", strerror( (*__errno_location ()) ));
0
62 if (askpass == NULL)
askpass == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
63 fatal("internal error: askpass undefined");
never executed: fatal("internal error: askpass undefined");
0
64 if (pipe(p) < 0) {
pipe(p) < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
65 error("ssh_askpass: pipe: %s", strerror(errno));-
66 return NULL;
never executed: return ((void *)0) ;
0
67 }-
68 osigchld = signal(SIGCHLD, SIG_DFL);-
69 if ((pid = fork()) < 0) {
(pid = fork()) < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
70 error("ssh_askpass: fork: %s", strerror(errno));-
71 signal(SIGCHLD, osigchld);-
72 return NULL;
never executed: return ((void *)0) ;
0
73 }-
74 if (pid == 0) {
pid == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
75 close(p[0]);-
76 if (dup2(p[1], STDOUT_FILENO) < 0)
dup2(p[1], 1 ) < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
77 fatal("ssh_askpass: dup2: %s", strerror(errno));
never executed: fatal("ssh_askpass: dup2: %s", strerror( (*__errno_location ()) ));
0
78 execlp(askpass, askpass, msg, (char *)NULL);-
79 fatal("ssh_askpass: exec(%s): %s", askpass, strerror(errno));-
80 }
never executed: end of block
0
81 close(p[1]);-
82-
83 len = 0;-
84 do {-
85 ssize_t r = read(p[0], buf + len, sizeof(buf) - 1 - len);-
86-
87 if (r == -1 && errno == EINTR)
r == -1Description
TRUEnever evaluated
FALSEnever evaluated
(*__errno_location ()) == 4Description
TRUEnever evaluated
FALSEnever evaluated
0
88 continue;
never executed: continue;
0
89 if (r <= 0)
r <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
90 break;
never executed: break;
0
91 len += r;-
92 } while (sizeof(buf) - 1 - len > 0);
never executed: end of block
sizeof(buf) - 1 - len > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
93 buf[len] = '\0';-
94-
95 close(p[0]);-
96 while ((ret = waitpid(pid, &status, 0)) < 0)
(ret = waitpid...tatus, 0)) < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
97 if (errno != EINTR)
(*__errno_location ()) != 4Description
TRUEnever evaluated
FALSEnever evaluated
0
98 break;
never executed: break;
0
99 signal(SIGCHLD, osigchld);-
100 if (ret == -1 || !WIFEXITED(status) || WEXITSTATUS(status) != 0) {
ret == -1Description
TRUEnever evaluated
FALSEnever evaluated
! ((( status ) & 0x7f) == 0)Description
TRUEnever evaluated
FALSEnever evaluated
((( status ) &...00) >> 8) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
101 explicit_bzero(buf, sizeof(buf));-
102 return NULL;
never executed: return ((void *)0) ;
0
103 }-
104-
105 buf[strcspn(buf, "\r\n")] = '\0';-
106 pass = xstrdup(buf);-
107 explicit_bzero(buf, sizeof(buf));-
108 return pass;
never executed: return pass;
0
109}-
110-
111/*-
112 * Reads a passphrase from /dev/tty with echo turned off/on. Returns the-
113 * passphrase (allocated with xmalloc). Exits if EOF is encountered. If-
114 * RP_ALLOW_STDIN is set, the passphrase will be read from stdin if no-
115 * tty is available-
116 */-
117char *-
118read_passphrase(const char *prompt, int flags)-
119{-
120 char *askpass = NULL, *ret, buf[1024];-
121 int rppflags, use_askpass = 0, ttyfd;-
122-
123 rppflags = (flags & RP_ECHO) ? RPP_ECHO_ON : RPP_ECHO_OFF;
(flags & 0x0001)Description
TRUEnever evaluated
FALSEnever evaluated
0
124 if (flags & RP_USE_ASKPASS)
flags & 0x0008Description
TRUEnever evaluated
FALSEnever evaluated
0
125 use_askpass = 1;
never executed: use_askpass = 1;
0
126 else if (flags & RP_ALLOW_STDIN) {
flags & 0x0002Description
TRUEnever evaluated
FALSEnever evaluated
0
127 if (!isatty(STDIN_FILENO)) {
!isatty( 0 )Description
TRUEnever evaluated
FALSEnever evaluated
0
128 debug("read_passphrase: stdin is not a tty");-
129 use_askpass = 1;-
130 }
never executed: end of block
0
131 } else {
never executed: end of block
0
132 rppflags |= RPP_REQUIRE_TTY;-
133 ttyfd = open(_PATH_TTY, O_RDWR);-
134 if (ttyfd >= 0)
ttyfd >= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
135 close(ttyfd);
never executed: close(ttyfd);
0
136 else {-
137 debug("read_passphrase: can't open %s: %s", _PATH_TTY,-
138 strerror(errno));-
139 use_askpass = 1;-
140 }
never executed: end of block
0
141 }-
142-
143 if ((flags & RP_USE_ASKPASS) && getenv("DISPLAY") == NULL)
(flags & 0x0008)Description
TRUEnever evaluated
FALSEnever evaluated
getenv("DISPLA...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
144 return (flags & RP_ALLOW_EOF) ? NULL : xstrdup("");
never executed: return (flags & 0x0004) ? ((void *)0) : xstrdup("");
(flags & 0x0004)Description
TRUEnever evaluated
FALSEnever evaluated
0
145-
146 if (use_askpass && getenv("DISPLAY")) {
use_askpassDescription
TRUEnever evaluated
FALSEnever evaluated
getenv("DISPLAY")Description
TRUEnever evaluated
FALSEnever evaluated
0
147 if (getenv(SSH_ASKPASS_ENV))
getenv("SSH_ASKPASS")Description
TRUEnever evaluated
FALSEnever evaluated
0
148 askpass = getenv(SSH_ASKPASS_ENV);
never executed: askpass = getenv("SSH_ASKPASS");
0
149 else-
150 askpass = _PATH_SSH_ASKPASS_DEFAULT;
never executed: askpass = "/var/tmp/openssh-test/libexec/ssh-askpass";
0
151 if ((ret = ssh_askpass(askpass, prompt)) == NULL)
(ret = ssh_ask...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
152 if (!(flags & RP_ALLOW_EOF))
!(flags & 0x0004)Description
TRUEnever evaluated
FALSEnever evaluated
0
153 return xstrdup("");
never executed: return xstrdup("");
0
154 return ret;
never executed: return ret;
0
155 }-
156-
157 if (readpassphrase(prompt, buf, sizeof buf, rppflags) == NULL) {
readpassphrase...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
158 if (flags & RP_ALLOW_EOF)
flags & 0x0004Description
TRUEnever evaluated
FALSEnever evaluated
0
159 return NULL;
never executed: return ((void *)0) ;
0
160 return xstrdup("");
never executed: return xstrdup("");
0
161 }-
162-
163 ret = xstrdup(buf);-
164 explicit_bzero(buf, sizeof(buf));-
165 return ret;
never executed: return ret;
0
166}-
167-
168int-
169ask_permission(const char *fmt, ...)-
170{-
171 va_list args;-
172 char *p, prompt[1024];-
173 int allowed = 0;-
174-
175 va_start(args, fmt);-
176 vsnprintf(prompt, sizeof(prompt), fmt, args);-
177 va_end(args);-
178-
179 p = read_passphrase(prompt, RP_USE_ASKPASS|RP_ALLOW_EOF);-
180 if (p != NULL) {
p != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
181 /*-
182 * Accept empty responses and responses consisting-
183 * of the word "yes" as affirmative.-
184 */-
185 if (*p == '\0' || *p == '\n' ||
*p == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
*p == '\n'Description
TRUEnever evaluated
FALSEnever evaluated
0
186 strcasecmp(p, "yes") == 0)
strcasecmp(p, "yes") == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
187 allowed = 1;
never executed: allowed = 1;
0
188 free(p);-
189 }
never executed: end of block
0
190-
191 return (allowed);
never executed: return (allowed);
0
192}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2