version 1.303, 2019/02/12 23:53:10 |
version 1.304, 2019/05/15 04:43:31 |
|
|
struct sshbuf *b; |
struct sshbuf *b; |
struct stat st; |
struct stat st; |
pid_t pid; |
pid_t pid; |
int i, r, to[2], from[2], status; |
int r, to[2], from[2], status; |
int sock = ssh_packet_get_connection_in(ssh); |
int sock = ssh_packet_get_connection_in(ssh); |
u_char rversion = 0, version = 2; |
u_char rversion = 0, version = 2; |
void (*osigchld)(int); |
void (*osigchld)(int); |
|
|
} |
} |
osigchld = signal(SIGCHLD, SIG_DFL); |
osigchld = signal(SIGCHLD, SIG_DFL); |
if (pid == 0) { |
if (pid == 0) { |
/* keep the socket on exec */ |
|
fcntl(sock, F_SETFD, 0); |
|
close(from[0]); |
close(from[0]); |
if (dup2(from[1], STDOUT_FILENO) < 0) |
if (dup2(from[1], STDOUT_FILENO) < 0) |
fatal("%s: dup2: %s", __func__, strerror(errno)); |
fatal("%s: dup2: %s", __func__, strerror(errno)); |
|
|
fatal("%s: dup2: %s", __func__, strerror(errno)); |
fatal("%s: dup2: %s", __func__, strerror(errno)); |
close(from[1]); |
close(from[1]); |
close(to[0]); |
close(to[0]); |
/* Close everything but stdio and the socket */ |
|
for (i = STDERR_FILENO + 1; i < sock; i++) |
if (dup2(sock, STDERR_FILENO + 1) < 0) |
close(i); |
fatal("%s: dup2: %s", __func__, strerror(errno)); |
|
sock = STDERR_FILENO + 1; |
|
fcntl(sock, F_SETFD, 0); /* keep the socket on exec */ |
closefrom(sock + 1); |
closefrom(sock + 1); |
|
|
debug3("%s: [child] pid=%ld, exec %s", |
debug3("%s: [child] pid=%ld, exec %s", |
__func__, (long)getpid(), _PATH_SSH_KEY_SIGN); |
__func__, (long)getpid(), _PATH_SSH_KEY_SIGN); |
execl(_PATH_SSH_KEY_SIGN, _PATH_SSH_KEY_SIGN, (char *)NULL); |
execl(_PATH_SSH_KEY_SIGN, _PATH_SSH_KEY_SIGN, (char *)NULL); |
|
|
} |
} |
close(from[1]); |
close(from[1]); |
close(to[0]); |
close(to[0]); |
|
sock = STDIN_FILENO + 1; |
|
|
if ((b = sshbuf_new()) == NULL) |
if ((b = sshbuf_new()) == NULL) |
fatal("%s: sshbuf_new failed", __func__); |
fatal("%s: sshbuf_new failed", __func__); |