Line | Source | Count |
1 | | - |
2 | | - |
3 | | - |
4 | | - |
5 | | - |
6 | | - |
7 | | - |
8 | | - |
9 | | - |
10 | | - |
11 | | - |
12 | static char * | - |
13 | ssh_askpass(char *askpass, const char *msg) | - |
14 | { | - |
15 | pid_t pid, ret; | - |
16 | size_t len; | - |
17 | char *pass; | - |
18 | int p[2], status; | - |
19 | char buf[1024]; | - |
20 | void (*osigchld)(int); | - |
21 | | - |
22 | if (fflush(TRUE | never evaluated | FALSE | never evaluated |
| 0 |
23 | stdoutTRUE | never evaluated | FALSE | never evaluated |
| 0 |
24 | ) != 0TRUE | never evaluated | FALSE | never evaluated |
) | 0 |
25 | error("ssh_askpass: fflush: %s", strerror( never executed: error("ssh_askpass: fflush: %s", strerror( (*__errno_location ()) )); | 0 |
26 | (*__errno_location ()) never executed: error("ssh_askpass: fflush: %s", strerror( (*__errno_location ()) )); | 0 |
27 | )); never executed: error("ssh_askpass: fflush: %s", strerror( (*__errno_location ()) )); | 0 |
28 | if (askpass == TRUE | never evaluated | FALSE | never evaluated |
| 0 |
29 | ((void *)0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
30 | ) | - |
31 | fatal("internal error: askpass undefined"); never executed: fatal("internal error: askpass undefined"); | 0 |
32 | if (pipe(p) < 0TRUE | never evaluated | FALSE | never evaluated |
) { | 0 |
33 | error("ssh_askpass: pipe: %s", strerror( | - |
34 | (*__errno_location ()) | - |
35 | )); | - |
36 | return never executed: return ((void *)0) ; never executed: return ((void *)0) ; | 0 |
37 | ((void *)0) never executed: return ((void *)0) ; | 0 |
38 | ; never executed: return ((void *)0) ; | 0 |
39 | } | - |
40 | osigchld = mysignal( | - |
41 | 17 | - |
42 | , | - |
43 | ((__sighandler_t) 0) | - |
44 | ); | - |
45 | if ((TRUE | never evaluated | FALSE | never evaluated |
pid = fork()) < 0TRUE | never evaluated | FALSE | never evaluated |
) { | 0 |
46 | error("ssh_askpass: fork: %s", strerror( | - |
47 | (*__errno_location ()) | - |
48 | )); | - |
49 | mysignal( | - |
50 | 17 | - |
51 | ,osigchld); | - |
52 | return never executed: return ((void *)0) ; never executed: return ((void *)0) ; | 0 |
53 | ((void *)0) never executed: return ((void *)0) ; | 0 |
54 | ; never executed: return ((void *)0) ; | 0 |
55 | } | - |
56 | if (pid == 0TRUE | never evaluated | FALSE | never evaluated |
) { | 0 |
57 | close(p[0]); | - |
58 | if (dup2(p[1], TRUE | never evaluated | FALSE | never evaluated |
| 0 |
59 | 1TRUE | never evaluated | FALSE | never evaluated |
| 0 |
60 | ) < 0TRUE | never evaluated | FALSE | never evaluated |
) | 0 |
61 | fatal("ssh_askpass: dup2: %s", strerror( never executed: fatal("ssh_askpass: dup2: %s", strerror( (*__errno_location ()) )); | 0 |
62 | (*__errno_location ()) never executed: fatal("ssh_askpass: dup2: %s", strerror( (*__errno_location ()) )); | 0 |
63 | )); never executed: fatal("ssh_askpass: dup2: %s", strerror( (*__errno_location ()) )); | 0 |
64 | execlp(askpass, askpass, msg, (char *) | - |
65 | ((void *)0) | - |
66 | ); | - |
67 | fatal("ssh_askpass: exec(%s): %s", askpass, strerror( | - |
68 | (*__errno_location ()) | - |
69 | )); | - |
70 | } never executed: end of block | 0 |
71 | close(p[1]); | - |
72 | | - |
73 | len = 0; | - |
74 | do { | - |
75 | ssize_t r = read(p[0], buf + len, sizeof(buf) - 1 - len); | - |
76 | | - |
77 | if (r == -1TRUE | never evaluated | FALSE | never evaluated |
&& | 0 |
78 | (*TRUE | never evaluated | FALSE | never evaluated |
__errno_location ()) TRUE | never evaluated | FALSE | never evaluated |
| 0 |
79 | == TRUE | never evaluated | FALSE | never evaluated |
| 0 |
80 | 4TRUE | never evaluated | FALSE | never evaluated |
| 0 |
81 | ) | - |
82 | continue; never executed: continue; | 0 |
83 | if (r <= 0TRUE | never evaluated | FALSE | never evaluated |
) | 0 |
84 | break; never executed: break; | 0 |
85 | len += r; | - |
86 | } never executed: end of block while (sizeof(buf) - 1 - len > 0TRUE | never evaluated | FALSE | never evaluated |
); | 0 |
87 | buf[len] = '\0'; | - |
88 | | - |
89 | close(p[0]); | - |
90 | while ((TRUE | never evaluated | FALSE | never evaluated |
ret = waitpid(pid, &status, 0)) < 0TRUE | never evaluated | FALSE | never evaluated |
) | 0 |
91 | if ( | - |
92 | (*TRUE | never evaluated | FALSE | never evaluated |
__errno_location ()) TRUE | never evaluated | FALSE | never evaluated |
| 0 |
93 | != TRUE | never evaluated | FALSE | never evaluated |
| 0 |
94 | 4TRUE | never evaluated | FALSE | never evaluated |
| 0 |
95 | ) | - |
96 | break; never executed: break; | 0 |
97 | mysignal( | - |
98 | 17 | - |
99 | ,osigchld); | - |
100 | if (ret == -1TRUE | never evaluated | FALSE | never evaluated |
|| !TRUE | never evaluated | FALSE | never evaluated |
| 0 |
101 | (((TRUE | never evaluated | FALSE | never evaluated |
| 0 |
102 | statusTRUE | never evaluated | FALSE | never evaluated |
| 0 |
103 | ) & 0x7f) == 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
104 | || | - |
105 | (((TRUE | never evaluated | FALSE | never evaluated |
| 0 |
106 | statusTRUE | never evaluated | FALSE | never evaluated |
| 0 |
107 | ) & 0xff00) >> 8) TRUE | never evaluated | FALSE | never evaluated |
| 0 |
108 | != 0TRUE | never evaluated | FALSE | never evaluated |
) { | 0 |
109 | explicit_bzero(buf, sizeof(buf)); | - |
110 | return never executed: return ((void *)0) ; never executed: return ((void *)0) ; | 0 |
111 | ((void *)0) never executed: return ((void *)0) ; | 0 |
112 | ; never executed: return ((void *)0) ; | 0 |
113 | } | - |
114 | | - |
115 | buf[ | - |
116 | __builtin_strcspn ( | - |
117 | buf | - |
118 | , | - |
119 | "\r\n" | - |
120 | ) | - |
121 | ] = '\0'; | - |
122 | pass = xstrdup(buf); | - |
123 | explicit_bzero(buf, sizeof(buf)); | - |
124 | return never executed: return pass; pass;never executed: return pass; | 0 |
125 | } | - |
126 | | - |
127 | | - |
128 | | - |
129 | | - |
130 | | - |
131 | | - |
132 | | - |
133 | char * | - |
134 | read_passphrase(const char *prompt, int flags) | - |
135 | { | - |
136 | char *askpass = | - |
137 | ((void *)0) | - |
138 | , *ret, buf[1024]; | - |
139 | int rppflags, use_askpass = 0, ttyfd; | - |
140 | | - |
141 | rppflags = (TRUE | never evaluated | FALSE | never evaluated |
flags & 0x0001)TRUE | never evaluated | FALSE | never evaluated |
? 0x01 : 0x00; | 0 |
142 | if (flags & 0x0008TRUE | never evaluated | FALSE | never evaluated |
) | 0 |
143 | use_askpass = 1; never executed: use_askpass = 1; | 0 |
144 | else if (flags & 0x0002TRUE | never evaluated | FALSE | never evaluated |
) { | 0 |
145 | if (!isatty(TRUE | never evaluated | FALSE | never evaluated |
| 0 |
146 | 0TRUE | never evaluated | FALSE | never evaluated |
| 0 |
147 | )TRUE | never evaluated | FALSE | never evaluated |
) { | 0 |
148 | debug("read_passphrase: stdin is not a tty"); | - |
149 | use_askpass = 1; | - |
150 | } never executed: end of block | 0 |
151 | } never executed: end of block else { | 0 |
152 | rppflags |= 0x02; | - |
153 | ttyfd = open( | - |
154 | "/dev/tty" | - |
155 | , | - |
156 | 02 | - |
157 | ); | - |
158 | if (ttyfd >= 0TRUE | never evaluated | FALSE | never evaluated |
) | 0 |
159 | close(ttyfd); never executed: close(ttyfd); | 0 |
160 | else { | - |
161 | debug("read_passphrase: can't open %s: %s", | - |
162 | "/dev/tty" | - |
163 | , | - |
164 | strerror( | - |
165 | (*__errno_location ()) | - |
166 | )); | - |
167 | use_askpass = 1; | - |
168 | } never executed: end of block | 0 |
169 | } | - |
170 | | - |
171 | if ((TRUE | never evaluated | FALSE | never evaluated |
flags & 0x0008)TRUE | never evaluated | FALSE | never evaluated |
&& getenv("DISPLAY") == TRUE | never evaluated | FALSE | never evaluated |
| 0 |
172 | ((void *)0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
173 | ) | - |
174 | return never executed: return (flags & 0x0004) ? ((void *)0) : xstrdup(""); (TRUE | never evaluated | FALSE | never evaluated |
flags & 0x0004)TRUE | never evaluated | FALSE | never evaluated |
? never executed: return (flags & 0x0004) ? ((void *)0) : xstrdup(""); | 0 |
175 | ((void *)0) never executed: return (flags & 0x0004) ? ((void *)0) : xstrdup(""); | 0 |
176 | : xstrdup(""); never executed: return (flags & 0x0004) ? ((void *)0) : xstrdup(""); | 0 |
177 | | - |
178 | if (use_askpassTRUE | never evaluated | FALSE | never evaluated |
&& getenv("DISPLAY")TRUE | never evaluated | FALSE | never evaluated |
) { | 0 |
179 | if (getenv("SSH_ASKPASS")TRUE | never evaluated | FALSE | never evaluated |
) | 0 |
180 | askpass = getenv("SSH_ASKPASS"); never executed: askpass = getenv("SSH_ASKPASS"); | 0 |
181 | else | - |
182 | askpass = "/var/tmp/openssh-test/libexec/ssh-askpass"; never executed: askpass = "/var/tmp/openssh-test/libexec/ssh-askpass"; | 0 |
183 | if ((TRUE | never evaluated | FALSE | never evaluated |
ret = ssh_askpass(askpass, prompt)) == TRUE | never evaluated | FALSE | never evaluated |
| 0 |
184 | ((void *)0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
185 | ) | - |
186 | if (!(flags & 0x0004)TRUE | never evaluated | FALSE | never evaluated |
) | 0 |
187 | return never executed: return xstrdup(""); xstrdup("");never executed: return xstrdup(""); | 0 |
188 | return never executed: return ret; ret;never executed: return ret; | 0 |
189 | } | - |
190 | | - |
191 | if (readpassphrase(prompt, buf, sizeof buf, rppflags) == TRUE | never evaluated | FALSE | never evaluated |
| 0 |
192 | ((void *)0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
193 | ) { | - |
194 | if (flags & 0x0004TRUE | never evaluated | FALSE | never evaluated |
) | 0 |
195 | return never executed: return ((void *)0) ; never executed: return ((void *)0) ; | 0 |
196 | ((void *)0) never executed: return ((void *)0) ; | 0 |
197 | ; never executed: return ((void *)0) ; | 0 |
198 | return never executed: return xstrdup(""); xstrdup("");never executed: return xstrdup(""); | 0 |
199 | } | - |
200 | | - |
201 | ret = xstrdup(buf); | - |
202 | explicit_bzero(buf, sizeof(buf)); | - |
203 | return never executed: return ret; ret;never executed: return ret; | 0 |
204 | } | - |
205 | | - |
206 | int | - |
207 | ask_permission(const char *fmt, ...) | - |
208 | { | - |
209 | va_list args; | - |
210 | char *p, prompt[1024]; | - |
211 | int allowed = 0; | - |
212 | | - |
213 | | - |
214 | __builtin_va_start( | - |
215 | args | - |
216 | , | - |
217 | fmt | - |
218 | ) | - |
219 | ; | - |
220 | vsnprintf(prompt, sizeof(prompt), fmt, args); | - |
221 | | - |
222 | __builtin_va_end( | - |
223 | args | - |
224 | ) | - |
225 | ; | - |
226 | | - |
227 | p = read_passphrase(prompt, 0x0008|0x0004); | - |
228 | if (p != TRUE | never evaluated | FALSE | never evaluated |
| 0 |
229 | ((void *)0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
230 | ) { | - |
231 | | - |
232 | | - |
233 | | - |
234 | | - |
235 | if (*TRUE | never evaluated | FALSE | never evaluated |
p == '\0'TRUE | never evaluated | FALSE | never evaluated |
|| *TRUE | never evaluated | FALSE | never evaluated |
p == '\n'TRUE | never evaluated | FALSE | never evaluated |
|| | 0 |
236 | strcasecmp(p, "yes") == 0TRUE | never evaluated | FALSE | never evaluated |
) | 0 |
237 | allowed = 1; never executed: allowed = 1; | 0 |
238 | free(p); | - |
239 | } never executed: end of block | 0 |
240 | | - |
241 | return never executed: return (allowed); (allowed);never executed: return (allowed); | 0 |
242 | } | - |
| | |