summaryrefslogtreecommitdiff
path: root/usr.bin/ssh/sshd.c
diff options
context:
space:
mode:
authorDamien Miller <djm@cvs.openbsd.org>2017-09-12 06:32:09 +0000
committerDamien Miller <djm@cvs.openbsd.org>2017-09-12 06:32:09 +0000
commit86e210b5de9cbe2d7a2891527383c0c26cf2ca64 (patch)
tree2617b8f87a44dcbcb57e9e02e6ca70806135be6a /usr.bin/ssh/sshd.c
parent75d559b3a60b7735d13f16652a3d18cfef49bf89 (diff)
refactor channels.c
Move static state to a "struct ssh_channels" that is allocated at runtime and tracked as a member of struct ssh. Explicitly pass "struct ssh" to all channels functions. Replace use of the legacy packet APIs in channels.c. Rework sshd_config PermitOpen handling: previously the configuration parser would call directly into the channels layer. After the refactor this is not possible, as the channels structures are allocated at connection time and aren't available when the configuration is parsed. The server config parser now tracks PermitOpen itself and explicitly configures the channels code later. ok markus@
Diffstat (limited to 'usr.bin/ssh/sshd.c')
-rw-r--r--usr.bin/ssh/sshd.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/usr.bin/ssh/sshd.c b/usr.bin/ssh/sshd.c
index 9cbfd342175..8551198829a 100644
--- a/usr.bin/ssh/sshd.c
+++ b/usr.bin/ssh/sshd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sshd.c,v 1.491 2017/07/01 13:50:45 djm Exp $ */
+/* $OpenBSD: sshd.c,v 1.492 2017/09/12 06:32:07 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -1510,9 +1510,6 @@ main(int ac, char **av)
"enabled authentication methods");
}
- /* set default channel AF */
- channel_set_af(options.address_family);
-
/* Check that there are no remaining arguments. */
if (optind < ac) {
fprintf(stderr, "Extra argument %s.\n", av[optind]);
@@ -1806,8 +1803,14 @@ main(int ac, char **av)
packet_set_connection(sock_in, sock_out);
packet_set_server();
ssh = active_state; /* XXX */
+
check_ip_options(ssh);
+ /* Prepare the channels layer */
+ channel_init_channels(ssh);
+ channel_set_af(ssh, options.address_family);
+ process_permitopen(ssh, &options);
+
/* Set SO_KEEPALIVE if requested. */
if (options.tcp_keep_alive && packet_connection_is_on_socket() &&
setsockopt(sock_in, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof(on)) < 0)
@@ -1907,10 +1910,10 @@ main(int ac, char **av)
options.client_alive_count_max);
/* Try to send all our hostkeys to the client */
- notify_hostkeys(active_state);
+ notify_hostkeys(ssh);
/* Start session. */
- do_authenticated(authctxt);
+ do_authenticated(ssh, authctxt);
/* The connection has been terminated. */
packet_get_bytes(&ibytes, &obytes);
@@ -2026,8 +2029,10 @@ do_ssh2_kex(void)
void
cleanup_exit(int i)
{
+ struct ssh *ssh = active_state; /* XXX */
+
if (the_authctxt) {
- do_cleanup(the_authctxt);
+ do_cleanup(ssh, the_authctxt);
if (use_privsep && privsep_is_preauth &&
pmonitor != NULL && pmonitor->m_pid > 1) {
debug("Killing privsep child %d", pmonitor->m_pid);