| 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 | stdout| TRUE | never evaluated | | FALSE | never evaluated |
| 0 |
| 24 | ) != 0| TRUE | 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) < 0| TRUE | 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()) < 0| TRUE | 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 == 0| TRUE | never evaluated | | FALSE | never evaluated |
) { | 0 |
| 57 | close(p[0]); | - |
| 58 | if (dup2(p[1], | TRUE | never evaluated | | FALSE | never evaluated |
| 0 |
| 59 | 1| TRUE | never evaluated | | FALSE | never evaluated |
| 0 |
| 60 | ) < 0| TRUE | 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 == -1| TRUE | 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 | 4| TRUE | never evaluated | | FALSE | never evaluated |
| 0 |
| 81 | ) | - |
| 82 | continue; never executed: continue; | 0 |
| 83 | if (r <= 0| TRUE | 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 > 0| TRUE | 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)) < 0| TRUE | 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 | 4| TRUE | never evaluated | | FALSE | never evaluated |
| 0 |
| 95 | ) | - |
| 96 | break; never executed: break; | 0 |
| 97 | mysignal( | - |
| 98 | 17 | - |
| 99 | ,osigchld); | - |
| 100 | if (ret == -1| TRUE | never evaluated | | FALSE | never evaluated |
|| !| TRUE | never evaluated | | FALSE | never evaluated |
| 0 |
| 101 | (((| TRUE | never evaluated | | FALSE | never evaluated |
| 0 |
| 102 | status| TRUE | 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 | status| TRUE | never evaluated | | FALSE | never evaluated |
| 0 |
| 107 | ) & 0xff00) >> 8) | TRUE | never evaluated | | FALSE | never evaluated |
| 0 |
| 108 | != 0| TRUE | 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 & 0x0008| TRUE | never evaluated | | FALSE | never evaluated |
) | 0 |
| 143 | use_askpass = 1; never executed: use_askpass = 1; | 0 |
| 144 | else if (flags & 0x0002| TRUE | never evaluated | | FALSE | never evaluated |
) { | 0 |
| 145 | if (!isatty(| TRUE | never evaluated | | FALSE | never evaluated |
| 0 |
| 146 | 0| TRUE | 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 >= 0| TRUE | 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_askpass| TRUE | 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 & 0x0004| TRUE | 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") == 0| TRUE | 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 | } | - |
| | |