upstream: convert ssh.c to new packet API
with & ok markus@ OpenBSD-Commit-ID: eb146878b24e85c2a09ee171afa6797c166a2e21
This commit is contained in:
parent
e3128b3862
commit
25b2ed6672
67
ssh.c
67
ssh.c
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: ssh.c,v 1.498 2019/01/19 21:31:32 djm Exp $ */
|
/* $OpenBSD: ssh.c,v 1.499 2019/01/19 21:36:06 djm Exp $ */
|
||||||
/*
|
/*
|
||||||
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||||
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
||||||
|
@ -113,8 +113,7 @@
|
||||||
#include "ssh-pkcs11.h"
|
#include "ssh-pkcs11.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "opacket.h" /* XXX */
|
extern struct ssh *active_state; /* XXX remove after sshconnect2.c updated */
|
||||||
extern struct ssh *active_state; /* XXX move here */
|
|
||||||
|
|
||||||
extern char *__progname;
|
extern char *__progname;
|
||||||
|
|
||||||
|
@ -653,8 +652,8 @@ main(int ac, char **av)
|
||||||
*/
|
*/
|
||||||
if ((ssh = ssh_alloc_session_state()) == NULL)
|
if ((ssh = ssh_alloc_session_state()) == NULL)
|
||||||
fatal("Couldn't allocate session state");
|
fatal("Couldn't allocate session state");
|
||||||
|
active_state = ssh; /* XXX */
|
||||||
channel_init_channels(ssh);
|
channel_init_channels(ssh);
|
||||||
active_state = ssh; /* XXX legacy API compat */
|
|
||||||
|
|
||||||
/* Parse command-line arguments. */
|
/* Parse command-line arguments. */
|
||||||
host = NULL;
|
host = NULL;
|
||||||
|
@ -1351,7 +1350,7 @@ main(int ac, char **av)
|
||||||
int sock;
|
int sock;
|
||||||
if ((sock = muxclient(options.control_path)) >= 0) {
|
if ((sock = muxclient(options.control_path)) >= 0) {
|
||||||
ssh_packet_set_connection(ssh, sock, sock);
|
ssh_packet_set_connection(ssh, sock, sock);
|
||||||
packet_set_mux();
|
ssh_packet_set_mux(ssh);
|
||||||
goto skip_connect;
|
goto skip_connect;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1378,11 +1377,9 @@ main(int ac, char **av)
|
||||||
if (addrs != NULL)
|
if (addrs != NULL)
|
||||||
freeaddrinfo(addrs);
|
freeaddrinfo(addrs);
|
||||||
|
|
||||||
packet_set_timeout(options.server_alive_interval,
|
ssh_packet_set_timeout(ssh, options.server_alive_interval,
|
||||||
options.server_alive_count_max);
|
options.server_alive_count_max);
|
||||||
|
|
||||||
ssh = active_state; /* XXX */
|
|
||||||
|
|
||||||
if (timeout_ms > 0)
|
if (timeout_ms > 0)
|
||||||
debug3("timeout: %d ms remain after connect", timeout_ms);
|
debug3("timeout: %d ms remain after connect", timeout_ms);
|
||||||
|
|
||||||
|
@ -1496,7 +1493,7 @@ main(int ac, char **av)
|
||||||
ssh_login(ssh, &sensitive_data, host, (struct sockaddr *)&hostaddr,
|
ssh_login(ssh, &sensitive_data, host, (struct sockaddr *)&hostaddr,
|
||||||
options.port, pw, timeout_ms);
|
options.port, pw, timeout_ms);
|
||||||
|
|
||||||
if (packet_connection_is_on_socket()) {
|
if (ssh_packet_connection_is_on_socket(ssh)) {
|
||||||
verbose("Authenticated to %s ([%s]:%d).", host,
|
verbose("Authenticated to %s ([%s]:%d).", host,
|
||||||
ssh_remote_ipaddr(ssh), ssh_remote_port(ssh));
|
ssh_remote_ipaddr(ssh), ssh_remote_port(ssh));
|
||||||
} else {
|
} else {
|
||||||
|
@ -1530,7 +1527,7 @@ main(int ac, char **av)
|
||||||
|
|
||||||
skip_connect:
|
skip_connect:
|
||||||
exit_status = ssh_session2(ssh, pw);
|
exit_status = ssh_session2(ssh, pw);
|
||||||
packet_close();
|
ssh_packet_close(ssh);
|
||||||
|
|
||||||
if (options.control_path != NULL && muxserver_sock != -1)
|
if (options.control_path != NULL && muxserver_sock != -1)
|
||||||
unlink(options.control_path);
|
unlink(options.control_path);
|
||||||
|
@ -1605,6 +1602,8 @@ static void
|
||||||
ssh_confirm_remote_forward(struct ssh *ssh, int type, u_int32_t seq, void *ctxt)
|
ssh_confirm_remote_forward(struct ssh *ssh, int type, u_int32_t seq, void *ctxt)
|
||||||
{
|
{
|
||||||
struct Forward *rfwd = (struct Forward *)ctxt;
|
struct Forward *rfwd = (struct Forward *)ctxt;
|
||||||
|
u_int port;
|
||||||
|
int r;
|
||||||
|
|
||||||
/* XXX verbose() on failure? */
|
/* XXX verbose() on failure? */
|
||||||
debug("remote forward %s for: listen %s%s%d, connect %s:%d",
|
debug("remote forward %s for: listen %s%s%d, connect %s:%d",
|
||||||
|
@ -1616,12 +1615,25 @@ ssh_confirm_remote_forward(struct ssh *ssh, int type, u_int32_t seq, void *ctxt)
|
||||||
rfwd->connect_host, rfwd->connect_port);
|
rfwd->connect_host, rfwd->connect_port);
|
||||||
if (rfwd->listen_path == NULL && rfwd->listen_port == 0) {
|
if (rfwd->listen_path == NULL && rfwd->listen_port == 0) {
|
||||||
if (type == SSH2_MSG_REQUEST_SUCCESS) {
|
if (type == SSH2_MSG_REQUEST_SUCCESS) {
|
||||||
rfwd->allocated_port = packet_get_int();
|
if ((r = sshpkt_get_u32(ssh, &port)) != 0)
|
||||||
logit("Allocated port %u for remote forward to %s:%d",
|
fatal("%s: %s", __func__, ssh_err(r));
|
||||||
rfwd->allocated_port,
|
if (port > 65535) {
|
||||||
rfwd->connect_host, rfwd->connect_port);
|
error("Invalid allocated port %u for remote "
|
||||||
channel_update_permission(ssh,
|
"forward to %s:%d", port,
|
||||||
rfwd->handle, rfwd->allocated_port);
|
rfwd->connect_host, rfwd->connect_port);
|
||||||
|
/* Ensure failure processing runs below */
|
||||||
|
type = SSH2_MSG_REQUEST_FAILURE;
|
||||||
|
channel_update_permission(ssh,
|
||||||
|
rfwd->handle, -1);
|
||||||
|
} else {
|
||||||
|
rfwd->allocated_port = (int)port;
|
||||||
|
logit("Allocated port %u for remote "
|
||||||
|
"forward to %s:%d",
|
||||||
|
rfwd->allocated_port, rfwd->connect_host,
|
||||||
|
rfwd->connect_port);
|
||||||
|
channel_update_permission(ssh,
|
||||||
|
rfwd->handle, rfwd->allocated_port);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
channel_update_permission(ssh, rfwd->handle, -1);
|
channel_update_permission(ssh, rfwd->handle, -1);
|
||||||
}
|
}
|
||||||
|
@ -1778,7 +1790,7 @@ ssh_session2_setup(struct ssh *ssh, int id, int success, void *arg)
|
||||||
{
|
{
|
||||||
extern char **environ;
|
extern char **environ;
|
||||||
const char *display;
|
const char *display;
|
||||||
int interactive = tty_flag;
|
int r, interactive = tty_flag;
|
||||||
char *proto = NULL, *data = NULL;
|
char *proto = NULL, *data = NULL;
|
||||||
|
|
||||||
if (!success)
|
if (!success)
|
||||||
|
@ -1804,11 +1816,12 @@ ssh_session2_setup(struct ssh *ssh, int id, int success, void *arg)
|
||||||
if (options.forward_agent) {
|
if (options.forward_agent) {
|
||||||
debug("Requesting authentication agent forwarding.");
|
debug("Requesting authentication agent forwarding.");
|
||||||
channel_request_start(ssh, id, "auth-agent-req@openssh.com", 0);
|
channel_request_start(ssh, id, "auth-agent-req@openssh.com", 0);
|
||||||
packet_send();
|
if ((r = sshpkt_send(ssh)) != 0)
|
||||||
|
fatal("%s: %s", __func__, ssh_err(r));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Tell the packet module whether this is an interactive session. */
|
/* Tell the packet module whether this is an interactive session. */
|
||||||
packet_set_interactive(interactive,
|
ssh_packet_set_interactive(ssh, interactive,
|
||||||
options.ip_qos_interactive, options.ip_qos_bulk);
|
options.ip_qos_interactive, options.ip_qos_bulk);
|
||||||
|
|
||||||
client_session2_setup(ssh, id, tty_flag, subsystem_flag, getenv("TERM"),
|
client_session2_setup(ssh, id, tty_flag, subsystem_flag, getenv("TERM"),
|
||||||
|
@ -1865,7 +1878,7 @@ ssh_session2_open(struct ssh *ssh)
|
||||||
static int
|
static int
|
||||||
ssh_session2(struct ssh *ssh, struct passwd *pw)
|
ssh_session2(struct ssh *ssh, struct passwd *pw)
|
||||||
{
|
{
|
||||||
int devnull, id = -1;
|
int r, devnull, id = -1;
|
||||||
char *cp, *tun_fwd_ifname = NULL;
|
char *cp, *tun_fwd_ifname = NULL;
|
||||||
|
|
||||||
/* XXX should be pre-session */
|
/* XXX should be pre-session */
|
||||||
|
@ -1895,7 +1908,7 @@ ssh_session2(struct ssh *ssh, struct passwd *pw)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Start listening for multiplex clients */
|
/* Start listening for multiplex clients */
|
||||||
if (!packet_get_mux())
|
if (!ssh_packet_get_mux(ssh))
|
||||||
muxserver_listen(ssh);
|
muxserver_listen(ssh);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1929,7 +1942,7 @@ ssh_session2(struct ssh *ssh, struct passwd *pw)
|
||||||
if (!no_shell_flag)
|
if (!no_shell_flag)
|
||||||
id = ssh_session2_open(ssh);
|
id = ssh_session2_open(ssh);
|
||||||
else {
|
else {
|
||||||
packet_set_interactive(
|
ssh_packet_set_interactive(ssh,
|
||||||
options.control_master == SSHCTL_MASTER_NO,
|
options.control_master == SSHCTL_MASTER_NO,
|
||||||
options.ip_qos_interactive, options.ip_qos_bulk);
|
options.ip_qos_interactive, options.ip_qos_bulk);
|
||||||
}
|
}
|
||||||
|
@ -1938,10 +1951,12 @@ ssh_session2(struct ssh *ssh, struct passwd *pw)
|
||||||
if (options.control_master == SSHCTL_MASTER_NO &&
|
if (options.control_master == SSHCTL_MASTER_NO &&
|
||||||
(datafellows & SSH_NEW_OPENSSH)) {
|
(datafellows & SSH_NEW_OPENSSH)) {
|
||||||
debug("Requesting no-more-sessions@openssh.com");
|
debug("Requesting no-more-sessions@openssh.com");
|
||||||
packet_start(SSH2_MSG_GLOBAL_REQUEST);
|
if ((r = sshpkt_start(ssh, SSH2_MSG_GLOBAL_REQUEST)) != 0 ||
|
||||||
packet_put_cstring("no-more-sessions@openssh.com");
|
(r = sshpkt_put_cstring(ssh,
|
||||||
packet_put_char(0);
|
"no-more-sessions@openssh.com")) != 0 ||
|
||||||
packet_send();
|
(r = sshpkt_put_u8(ssh, 0)) != 0 ||
|
||||||
|
(r = sshpkt_send(ssh)) != 0)
|
||||||
|
fatal("%s: %s", __func__, ssh_err(r));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Execute a local command */
|
/* Execute a local command */
|
||||||
|
|
Loading…
Reference in New Issue