channels.c revision 204917
174462Salfred/* $OpenBSD: channels.c,v 1.303 2010/01/30 21:12:08 djm Exp $ */
274462Salfred/*
3261057Smav * Author: Tatu Ylonen <ylo@cs.hut.fi>
4261057Smav * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
5261057Smav *                    All rights reserved
68870Srgrimes * This file contains functions for generic socket connection forwarding.
7261057Smav * There is also code for initiating connection forwarding for X11 connections,
8261057Smav * arbitrary tcp/ip connections, and the authentication agent connection.
9261057Smav *
10261057Smav * As far as I am concerned, the code I have written for this software
11261057Smav * can be used freely for any purpose.  Any derived versions of this
12261057Smav * software must be clearly marked as such, and if the derived work is
13261057Smav * incompatible with the protocol description in the RFC file, it must be
14261057Smav * called by a name other than "ssh" or "Secure Shell".
15261057Smav *
16261057Smav * SSH2 support added by Markus Friedl.
17261057Smav * Copyright (c) 1999, 2000, 2001, 2002 Markus Friedl.  All rights reserved.
18261057Smav * Copyright (c) 1999 Dug Song.  All rights reserved.
19261057Smav * Copyright (c) 1999 Theo de Raadt.  All rights reserved.
20261057Smav *
21261057Smav * Redistribution and use in source and binary forms, with or without
22261057Smav * modification, are permitted provided that the following conditions
23261057Smav * are met:
24261057Smav * 1. Redistributions of source code must retain the above copyright
25261057Smav *    notice, this list of conditions and the following disclaimer.
26261057Smav * 2. Redistributions in binary form must reproduce the above copyright
27261057Smav *    notice, this list of conditions and the following disclaimer in the
28261057Smav *    documentation and/or other materials provided with the distribution.
291901Swollman *
301901Swollman * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
311901Swollman * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
32136581Sobrien * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
33136581Sobrien * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
341901Swollman * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
35136581Sobrien * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3692990Sobrien * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3792990Sobrien * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
381901Swollman * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
391901Swollman * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
401901Swollman */
4117542Speter
4217542Speter#include "includes.h"
431901Swollman
441901Swollman#include <sys/types.h>
4571579Sdeischen#include <sys/ioctl.h>
461901Swollman#include <sys/un.h>
471901Swollman#include <sys/socket.h>
4874462Salfred#ifdef HAVE_SYS_TIME_H
491901Swollman# include <sys/time.h>
5074462Salfred#endif
5174462Salfred
5274462Salfred#include <netinet/in.h>
5311666Sphk#include <arpa/inet.h>
5474462Salfred
5574462Salfred#include <errno.h>
5674462Salfred#include <fcntl.h>
5711666Sphk#include <netdb.h>
5871579Sdeischen#include <stdio.h>
591901Swollman#include <stdlib.h>
601901Swollman#include <string.h>
611901Swollman#include <termios.h>
621901Swollman#include <unistd.h>
6317542Speter#include <stdarg.h>
6417542Speter
651901Swollman#include "openbsd-compat/sys-queue.h"
661901Swollman#include "xmalloc.h"
671901Swollman#include "ssh.h"
6856629Sshin#include "ssh1.h"
6955918Sshin#include "ssh2.h"
7055918Sshin#include "packet.h"
7156629Sshin#include "log.h"
7274462Salfred#include "misc.h"
7356629Sshin#include "buffer.h"
7455918Sshin#include "channels.h"
7556629Sshin#include "compat.h"
7655918Sshin#include "canohost.h"
7755918Sshin#include "key.h"
7855918Sshin#include "authfd.h"
7956629Sshin#include "pathnames.h"
8056629Sshin
8156629Sshin/* -- channel core */
8274462Salfred
8356629Sshin/*
8474462Salfred * Pointer to an array containing all allocated channels.  The array is
8556629Sshin * dynamically extended as needed.
8674462Salfred */
8774462Salfredstatic Channel **channels = NULL;
8855918Sshin
8955918Sshin/*
9056629Sshin * Size of the channel array.  All slots of the array must always be
9156629Sshin * initialized (at least the type field); unused slots set to NULL
9256629Sshin */
9371579Sdeischenstatic u_int channels_alloc = 0;
9456629Sshin
9556629Sshin/*
9656629Sshin * Maximum file descriptor value used in any of the channels.  This is
9774462Salfred * updated in channel_new.
9856629Sshin */
9956629Sshinstatic int channel_max_fd = 0;
10056629Sshin
10174462Salfred
10274462Salfred/* -- tcp forwarding */
10356629Sshin
10456629Sshin/*
10556629Sshin * Data structure for storing which hosts are permitted for forward requests.
10656629Sshin * The local sides of any remote forwards are stored in this array to prevent
10756629Sshin * a corrupt remote server from accessing arbitrary TCP/IP ports on our local
10874462Salfred * network (which might be behind a firewall).
10974462Salfred */
11074462Salfredtypedef struct {
11174462Salfred	char *host_to_connect;		/* Connect to 'host'. */
11256629Sshin	u_short port_to_connect;	/* Connect to 'port'. */
11356629Sshin	u_short listen_port;		/* Remote side should listen port number. */
11456629Sshin} ForwardPermission;
11556629Sshin
11656629Sshin/* List of all permitted host/port pairs to connect by the user. */
11774462Salfredstatic ForwardPermission permitted_opens[SSH_MAX_FORWARDS_PER_DIRECTION];
11874462Salfred
11974462Salfred/* List of all permitted host/port pairs to connect by the admin. */
12074462Salfredstatic ForwardPermission permitted_adm_opens[SSH_MAX_FORWARDS_PER_DIRECTION];
12156629Sshin
12255918Sshin/* Number of permitted host/port pairs in the array permitted by the user. */
12355918Sshinstatic int num_permitted_opens = 0;
12456629Sshin
12556629Sshin/* Number of permitted host/port pair in the array permitted by the admin. */
12655918Sshinstatic int num_adm_permitted_opens = 0;
12774462Salfred
12874462Salfred/*
12956629Sshin * If this is true, all opens are permitted.  This is the case on the server
13071579Sdeischen * on which we have to trust the client anyway, and the user could do
13117542Speter * anything after logging in anyway.
13256629Sshin */
13317542Speterstatic int all_opens_permitted = 0;
13471579Sdeischen
13556629Sshin
13617542Speter/* -- X11 forwarding */
13756629Sshin
1381901Swollman/* Maximum number of fake X11 displays to try. */
13917542Speter#define MAX_DISPLAYS  1000
14071579Sdeischen
14117542Speter/* Saved X11 local (client) display. */
14274462Salfredstatic char *x11_saved_display = NULL;
14317542Speter
14417542Speter/* Saved X11 authentication protocol name. */
14574462Salfredstatic char *x11_saved_proto = NULL;
14671579Sdeischen
14756629Sshin/* Saved X11 authentication data.  This is the real data. */
14817542Speterstatic char *x11_saved_data = NULL;
14917542Speterstatic u_int x11_saved_data_len = 0;
1501901Swollman
15117542Speter/*
15256629Sshin * Fake X11 authentication data.  This is what the server will be sending us;
15374462Salfred * we should replace any occurrences of this by the real data.
15471579Sdeischen */
15556629Sshinstatic u_char *x11_fake_data = NULL;
15656629Sshinstatic u_int x11_fake_data_len;
15756629Sshin
1581901Swollman
15917542Speter/* -- agent forwarding */
1601901Swollman
161#define	NUM_SOCKS	10
162
163/* AF_UNSPEC or AF_INET or AF_INET6 */
164static int IPv4or6 = AF_UNSPEC;
165
166/* helper */
167static void port_open_helper(Channel *c, char *rtype);
168
169/* non-blocking connect helpers */
170static int connect_next(struct channel_connect *);
171static void channel_connect_ctx_free(struct channel_connect *);
172
173/* -- channel core */
174
175Channel *
176channel_by_id(int id)
177{
178	Channel *c;
179
180	if (id < 0 || (u_int)id >= channels_alloc) {
181		logit("channel_by_id: %d: bad id", id);
182		return NULL;
183	}
184	c = channels[id];
185	if (c == NULL) {
186		logit("channel_by_id: %d: bad id: channel free", id);
187		return NULL;
188	}
189	return c;
190}
191
192/*
193 * Returns the channel if it is allowed to receive protocol messages.
194 * Private channels, like listening sockets, may not receive messages.
195 */
196Channel *
197channel_lookup(int id)
198{
199	Channel *c;
200
201	if ((c = channel_by_id(id)) == NULL)
202		return (NULL);
203
204	switch (c->type) {
205	case SSH_CHANNEL_X11_OPEN:
206	case SSH_CHANNEL_LARVAL:
207	case SSH_CHANNEL_CONNECTING:
208	case SSH_CHANNEL_DYNAMIC:
209	case SSH_CHANNEL_OPENING:
210	case SSH_CHANNEL_OPEN:
211	case SSH_CHANNEL_INPUT_DRAINING:
212	case SSH_CHANNEL_OUTPUT_DRAINING:
213		return (c);
214	}
215	logit("Non-public channel %d, type %d.", id, c->type);
216	return (NULL);
217}
218
219/*
220 * Register filedescriptors for a channel, used when allocating a channel or
221 * when the channel consumer/producer is ready, e.g. shell exec'd
222 */
223static void
224channel_register_fds(Channel *c, int rfd, int wfd, int efd,
225    int extusage, int nonblock, int is_tty)
226{
227	/* Update the maximum file descriptor value. */
228	channel_max_fd = MAX(channel_max_fd, rfd);
229	channel_max_fd = MAX(channel_max_fd, wfd);
230	channel_max_fd = MAX(channel_max_fd, efd);
231
232	if (rfd != -1)
233		fcntl(rfd, F_SETFD, FD_CLOEXEC);
234	if (wfd != -1 && wfd != rfd)
235		fcntl(wfd, F_SETFD, FD_CLOEXEC);
236	if (efd != -1 && efd != rfd && efd != wfd)
237		fcntl(efd, F_SETFD, FD_CLOEXEC);
238
239	c->rfd = rfd;
240	c->wfd = wfd;
241	c->sock = (rfd == wfd) ? rfd : -1;
242	c->efd = efd;
243	c->extended_usage = extusage;
244
245	if ((c->isatty = is_tty) != 0)
246		debug2("channel %d: rfd %d isatty", c->self, c->rfd);
247	c->wfd_isatty = is_tty || isatty(c->wfd);
248
249	/* enable nonblocking mode */
250	if (nonblock) {
251		if (rfd != -1)
252			set_nonblock(rfd);
253		if (wfd != -1)
254			set_nonblock(wfd);
255		if (efd != -1)
256			set_nonblock(efd);
257	}
258}
259
260/*
261 * Allocate a new channel object and set its type and socket. This will cause
262 * remote_name to be freed.
263 */
264Channel *
265channel_new(char *ctype, int type, int rfd, int wfd, int efd,
266    u_int window, u_int maxpack, int extusage, char *remote_name, int nonblock)
267{
268	int found;
269	u_int i;
270	Channel *c;
271
272	/* Do initial allocation if this is the first call. */
273	if (channels_alloc == 0) {
274		channels_alloc = 10;
275		channels = xcalloc(channels_alloc, sizeof(Channel *));
276		for (i = 0; i < channels_alloc; i++)
277			channels[i] = NULL;
278	}
279	/* Try to find a free slot where to put the new channel. */
280	for (found = -1, i = 0; i < channels_alloc; i++)
281		if (channels[i] == NULL) {
282			/* Found a free slot. */
283			found = (int)i;
284			break;
285		}
286	if (found < 0) {
287		/* There are no free slots.  Take last+1 slot and expand the array.  */
288		found = channels_alloc;
289		if (channels_alloc > 10000)
290			fatal("channel_new: internal error: channels_alloc %d "
291			    "too big.", channels_alloc);
292		channels = xrealloc(channels, channels_alloc + 10,
293		    sizeof(Channel *));
294		channels_alloc += 10;
295		debug2("channel: expanding %d", channels_alloc);
296		for (i = found; i < channels_alloc; i++)
297			channels[i] = NULL;
298	}
299	/* Initialize and return new channel. */
300	c = channels[found] = xcalloc(1, sizeof(Channel));
301	buffer_init(&c->input);
302	buffer_init(&c->output);
303	buffer_init(&c->extended);
304	c->path = NULL;
305	c->ostate = CHAN_OUTPUT_OPEN;
306	c->istate = CHAN_INPUT_OPEN;
307	c->flags = 0;
308	channel_register_fds(c, rfd, wfd, efd, extusage, nonblock, 0);
309	c->self = found;
310	c->type = type;
311	c->ctype = ctype;
312	c->local_window = window;
313	c->local_window_max = window;
314	c->local_consumed = 0;
315	c->local_maxpacket = maxpack;
316	c->remote_id = -1;
317	c->remote_name = xstrdup(remote_name);
318	c->remote_window = 0;
319	c->remote_maxpacket = 0;
320	c->force_drain = 0;
321	c->single_connection = 0;
322	c->detach_user = NULL;
323	c->detach_close = 0;
324	c->open_confirm = NULL;
325	c->open_confirm_ctx = NULL;
326	c->input_filter = NULL;
327	c->output_filter = NULL;
328	c->filter_ctx = NULL;
329	c->filter_cleanup = NULL;
330	c->ctl_chan = -1;
331	c->mux_rcb = NULL;
332	c->mux_ctx = NULL;
333	c->delayed = 1;		/* prevent call to channel_post handler */
334	TAILQ_INIT(&c->status_confirms);
335	debug("channel %d: new [%s]", found, remote_name);
336	return c;
337}
338
339static int
340channel_find_maxfd(void)
341{
342	u_int i;
343	int max = 0;
344	Channel *c;
345
346	for (i = 0; i < channels_alloc; i++) {
347		c = channels[i];
348		if (c != NULL) {
349			max = MAX(max, c->rfd);
350			max = MAX(max, c->wfd);
351			max = MAX(max, c->efd);
352		}
353	}
354	return max;
355}
356
357int
358channel_close_fd(int *fdp)
359{
360	int ret = 0, fd = *fdp;
361
362	if (fd != -1) {
363		ret = close(fd);
364		*fdp = -1;
365		if (fd == channel_max_fd)
366			channel_max_fd = channel_find_maxfd();
367	}
368	return ret;
369}
370
371/* Close all channel fd/socket. */
372static void
373channel_close_fds(Channel *c)
374{
375	debug3("channel %d: close_fds r %d w %d e %d",
376	    c->self, c->rfd, c->wfd, c->efd);
377
378	channel_close_fd(&c->sock);
379	channel_close_fd(&c->rfd);
380	channel_close_fd(&c->wfd);
381	channel_close_fd(&c->efd);
382}
383
384/* Free the channel and close its fd/socket. */
385void
386channel_free(Channel *c)
387{
388	char *s;
389	u_int i, n;
390	struct channel_confirm *cc;
391
392	for (n = 0, i = 0; i < channels_alloc; i++)
393		if (channels[i])
394			n++;
395	debug("channel %d: free: %s, nchannels %u", c->self,
396	    c->remote_name ? c->remote_name : "???", n);
397
398	s = channel_open_message();
399	debug3("channel %d: status: %s", c->self, s);
400	xfree(s);
401
402	if (c->sock != -1)
403		shutdown(c->sock, SHUT_RDWR);
404	channel_close_fds(c);
405	buffer_free(&c->input);
406	buffer_free(&c->output);
407	buffer_free(&c->extended);
408	if (c->remote_name) {
409		xfree(c->remote_name);
410		c->remote_name = NULL;
411	}
412	if (c->path) {
413		xfree(c->path);
414		c->path = NULL;
415	}
416	while ((cc = TAILQ_FIRST(&c->status_confirms)) != NULL) {
417		if (cc->abandon_cb != NULL)
418			cc->abandon_cb(c, cc->ctx);
419		TAILQ_REMOVE(&c->status_confirms, cc, entry);
420		bzero(cc, sizeof(*cc));
421		xfree(cc);
422	}
423	if (c->filter_cleanup != NULL && c->filter_ctx != NULL)
424		c->filter_cleanup(c->self, c->filter_ctx);
425	channels[c->self] = NULL;
426	xfree(c);
427}
428
429void
430channel_free_all(void)
431{
432	u_int i;
433
434	for (i = 0; i < channels_alloc; i++)
435		if (channels[i] != NULL)
436			channel_free(channels[i]);
437}
438
439/*
440 * Closes the sockets/fds of all channels.  This is used to close extra file
441 * descriptors after a fork.
442 */
443void
444channel_close_all(void)
445{
446	u_int i;
447
448	for (i = 0; i < channels_alloc; i++)
449		if (channels[i] != NULL)
450			channel_close_fds(channels[i]);
451}
452
453/*
454 * Stop listening to channels.
455 */
456void
457channel_stop_listening(void)
458{
459	u_int i;
460	Channel *c;
461
462	for (i = 0; i < channels_alloc; i++) {
463		c = channels[i];
464		if (c != NULL) {
465			switch (c->type) {
466			case SSH_CHANNEL_AUTH_SOCKET:
467			case SSH_CHANNEL_PORT_LISTENER:
468			case SSH_CHANNEL_RPORT_LISTENER:
469			case SSH_CHANNEL_X11_LISTENER:
470				channel_close_fd(&c->sock);
471				channel_free(c);
472				break;
473			}
474		}
475	}
476}
477
478/*
479 * Returns true if no channel has too much buffered data, and false if one or
480 * more channel is overfull.
481 */
482int
483channel_not_very_much_buffered_data(void)
484{
485	u_int i;
486	Channel *c;
487
488	for (i = 0; i < channels_alloc; i++) {
489		c = channels[i];
490		if (c != NULL && c->type == SSH_CHANNEL_OPEN) {
491#if 0
492			if (!compat20 &&
493			    buffer_len(&c->input) > packet_get_maxsize()) {
494				debug2("channel %d: big input buffer %d",
495				    c->self, buffer_len(&c->input));
496				return 0;
497			}
498#endif
499			if (buffer_len(&c->output) > packet_get_maxsize()) {
500				debug2("channel %d: big output buffer %u > %u",
501				    c->self, buffer_len(&c->output),
502				    packet_get_maxsize());
503				return 0;
504			}
505		}
506	}
507	return 1;
508}
509
510/* Returns true if any channel is still open. */
511int
512channel_still_open(void)
513{
514	u_int i;
515	Channel *c;
516
517	for (i = 0; i < channels_alloc; i++) {
518		c = channels[i];
519		if (c == NULL)
520			continue;
521		switch (c->type) {
522		case SSH_CHANNEL_X11_LISTENER:
523		case SSH_CHANNEL_PORT_LISTENER:
524		case SSH_CHANNEL_RPORT_LISTENER:
525		case SSH_CHANNEL_MUX_LISTENER:
526		case SSH_CHANNEL_CLOSED:
527		case SSH_CHANNEL_AUTH_SOCKET:
528		case SSH_CHANNEL_DYNAMIC:
529		case SSH_CHANNEL_CONNECTING:
530		case SSH_CHANNEL_ZOMBIE:
531			continue;
532		case SSH_CHANNEL_LARVAL:
533			if (!compat20)
534				fatal("cannot happen: SSH_CHANNEL_LARVAL");
535			continue;
536		case SSH_CHANNEL_OPENING:
537		case SSH_CHANNEL_OPEN:
538		case SSH_CHANNEL_X11_OPEN:
539		case SSH_CHANNEL_MUX_CLIENT:
540			return 1;
541		case SSH_CHANNEL_INPUT_DRAINING:
542		case SSH_CHANNEL_OUTPUT_DRAINING:
543			if (!compat13)
544				fatal("cannot happen: OUT_DRAIN");
545			return 1;
546		default:
547			fatal("channel_still_open: bad channel type %d", c->type);
548			/* NOTREACHED */
549		}
550	}
551	return 0;
552}
553
554/* Returns the id of an open channel suitable for keepaliving */
555int
556channel_find_open(void)
557{
558	u_int i;
559	Channel *c;
560
561	for (i = 0; i < channels_alloc; i++) {
562		c = channels[i];
563		if (c == NULL || c->remote_id < 0)
564			continue;
565		switch (c->type) {
566		case SSH_CHANNEL_CLOSED:
567		case SSH_CHANNEL_DYNAMIC:
568		case SSH_CHANNEL_X11_LISTENER:
569		case SSH_CHANNEL_PORT_LISTENER:
570		case SSH_CHANNEL_RPORT_LISTENER:
571		case SSH_CHANNEL_MUX_LISTENER:
572		case SSH_CHANNEL_MUX_CLIENT:
573		case SSH_CHANNEL_OPENING:
574		case SSH_CHANNEL_CONNECTING:
575		case SSH_CHANNEL_ZOMBIE:
576			continue;
577		case SSH_CHANNEL_LARVAL:
578		case SSH_CHANNEL_AUTH_SOCKET:
579		case SSH_CHANNEL_OPEN:
580		case SSH_CHANNEL_X11_OPEN:
581			return i;
582		case SSH_CHANNEL_INPUT_DRAINING:
583		case SSH_CHANNEL_OUTPUT_DRAINING:
584			if (!compat13)
585				fatal("cannot happen: OUT_DRAIN");
586			return i;
587		default:
588			fatal("channel_find_open: bad channel type %d", c->type);
589			/* NOTREACHED */
590		}
591	}
592	return -1;
593}
594
595
596/*
597 * Returns a message describing the currently open forwarded connections,
598 * suitable for sending to the client.  The message contains crlf pairs for
599 * newlines.
600 */
601char *
602channel_open_message(void)
603{
604	Buffer buffer;
605	Channel *c;
606	char buf[1024], *cp;
607	u_int i;
608
609	buffer_init(&buffer);
610	snprintf(buf, sizeof buf, "The following connections are open:\r\n");
611	buffer_append(&buffer, buf, strlen(buf));
612	for (i = 0; i < channels_alloc; i++) {
613		c = channels[i];
614		if (c == NULL)
615			continue;
616		switch (c->type) {
617		case SSH_CHANNEL_X11_LISTENER:
618		case SSH_CHANNEL_PORT_LISTENER:
619		case SSH_CHANNEL_RPORT_LISTENER:
620		case SSH_CHANNEL_CLOSED:
621		case SSH_CHANNEL_AUTH_SOCKET:
622		case SSH_CHANNEL_ZOMBIE:
623		case SSH_CHANNEL_MUX_CLIENT:
624		case SSH_CHANNEL_MUX_LISTENER:
625			continue;
626		case SSH_CHANNEL_LARVAL:
627		case SSH_CHANNEL_OPENING:
628		case SSH_CHANNEL_CONNECTING:
629		case SSH_CHANNEL_DYNAMIC:
630		case SSH_CHANNEL_OPEN:
631		case SSH_CHANNEL_X11_OPEN:
632		case SSH_CHANNEL_INPUT_DRAINING:
633		case SSH_CHANNEL_OUTPUT_DRAINING:
634			snprintf(buf, sizeof buf,
635			    "  #%d %.300s (t%d r%d i%d/%d o%d/%d fd %d/%d cc %d)\r\n",
636			    c->self, c->remote_name,
637			    c->type, c->remote_id,
638			    c->istate, buffer_len(&c->input),
639			    c->ostate, buffer_len(&c->output),
640			    c->rfd, c->wfd, c->ctl_chan);
641			buffer_append(&buffer, buf, strlen(buf));
642			continue;
643		default:
644			fatal("channel_open_message: bad channel type %d", c->type);
645			/* NOTREACHED */
646		}
647	}
648	buffer_append(&buffer, "\0", 1);
649	cp = xstrdup(buffer_ptr(&buffer));
650	buffer_free(&buffer);
651	return cp;
652}
653
654void
655channel_send_open(int id)
656{
657	Channel *c = channel_lookup(id);
658
659	if (c == NULL) {
660		logit("channel_send_open: %d: bad id", id);
661		return;
662	}
663	debug2("channel %d: send open", id);
664	packet_start(SSH2_MSG_CHANNEL_OPEN);
665	packet_put_cstring(c->ctype);
666	packet_put_int(c->self);
667	packet_put_int(c->local_window);
668	packet_put_int(c->local_maxpacket);
669	packet_send();
670}
671
672void
673channel_request_start(int id, char *service, int wantconfirm)
674{
675	Channel *c = channel_lookup(id);
676
677	if (c == NULL) {
678		logit("channel_request_start: %d: unknown channel id", id);
679		return;
680	}
681	debug2("channel %d: request %s confirm %d", id, service, wantconfirm);
682	packet_start(SSH2_MSG_CHANNEL_REQUEST);
683	packet_put_int(c->remote_id);
684	packet_put_cstring(service);
685	packet_put_char(wantconfirm);
686}
687
688void
689channel_register_status_confirm(int id, channel_confirm_cb *cb,
690    channel_confirm_abandon_cb *abandon_cb, void *ctx)
691{
692	struct channel_confirm *cc;
693	Channel *c;
694
695	if ((c = channel_lookup(id)) == NULL)
696		fatal("channel_register_expect: %d: bad id", id);
697
698	cc = xmalloc(sizeof(*cc));
699	cc->cb = cb;
700	cc->abandon_cb = abandon_cb;
701	cc->ctx = ctx;
702	TAILQ_INSERT_TAIL(&c->status_confirms, cc, entry);
703}
704
705void
706channel_register_open_confirm(int id, channel_callback_fn *fn, void *ctx)
707{
708	Channel *c = channel_lookup(id);
709
710	if (c == NULL) {
711		logit("channel_register_open_confirm: %d: bad id", id);
712		return;
713	}
714	c->open_confirm = fn;
715	c->open_confirm_ctx = ctx;
716}
717
718void
719channel_register_cleanup(int id, channel_callback_fn *fn, int do_close)
720{
721	Channel *c = channel_by_id(id);
722
723	if (c == NULL) {
724		logit("channel_register_cleanup: %d: bad id", id);
725		return;
726	}
727	c->detach_user = fn;
728	c->detach_close = do_close;
729}
730
731void
732channel_cancel_cleanup(int id)
733{
734	Channel *c = channel_by_id(id);
735
736	if (c == NULL) {
737		logit("channel_cancel_cleanup: %d: bad id", id);
738		return;
739	}
740	c->detach_user = NULL;
741	c->detach_close = 0;
742}
743
744void
745channel_register_filter(int id, channel_infilter_fn *ifn,
746    channel_outfilter_fn *ofn, channel_filter_cleanup_fn *cfn, void *ctx)
747{
748	Channel *c = channel_lookup(id);
749
750	if (c == NULL) {
751		logit("channel_register_filter: %d: bad id", id);
752		return;
753	}
754	c->input_filter = ifn;
755	c->output_filter = ofn;
756	c->filter_ctx = ctx;
757	c->filter_cleanup = cfn;
758}
759
760void
761channel_set_fds(int id, int rfd, int wfd, int efd,
762    int extusage, int nonblock, int is_tty, u_int window_max)
763{
764	Channel *c = channel_lookup(id);
765
766	if (c == NULL || c->type != SSH_CHANNEL_LARVAL)
767		fatal("channel_activate for non-larval channel %d.", id);
768	channel_register_fds(c, rfd, wfd, efd, extusage, nonblock, is_tty);
769	c->type = SSH_CHANNEL_OPEN;
770	c->local_window = c->local_window_max = window_max;
771	packet_start(SSH2_MSG_CHANNEL_WINDOW_ADJUST);
772	packet_put_int(c->remote_id);
773	packet_put_int(c->local_window);
774	packet_send();
775}
776
777/*
778 * 'channel_pre*' are called just before select() to add any bits relevant to
779 * channels in the select bitmasks.
780 */
781/*
782 * 'channel_post*': perform any appropriate operations for channels which
783 * have events pending.
784 */
785typedef void chan_fn(Channel *c, fd_set *readset, fd_set *writeset);
786chan_fn *channel_pre[SSH_CHANNEL_MAX_TYPE];
787chan_fn *channel_post[SSH_CHANNEL_MAX_TYPE];
788
789/* ARGSUSED */
790static void
791channel_pre_listener(Channel *c, fd_set *readset, fd_set *writeset)
792{
793	FD_SET(c->sock, readset);
794}
795
796/* ARGSUSED */
797static void
798channel_pre_connecting(Channel *c, fd_set *readset, fd_set *writeset)
799{
800	debug3("channel %d: waiting for connection", c->self);
801	FD_SET(c->sock, writeset);
802}
803
804static void
805channel_pre_open_13(Channel *c, fd_set *readset, fd_set *writeset)
806{
807	if (buffer_len(&c->input) < packet_get_maxsize())
808		FD_SET(c->sock, readset);
809	if (buffer_len(&c->output) > 0)
810		FD_SET(c->sock, writeset);
811}
812
813static void
814channel_pre_open(Channel *c, fd_set *readset, fd_set *writeset)
815{
816	u_int limit = compat20 ? c->remote_window : packet_get_maxsize();
817
818	if (c->istate == CHAN_INPUT_OPEN &&
819	    limit > 0 &&
820	    buffer_len(&c->input) < limit &&
821	    buffer_check_alloc(&c->input, CHAN_RBUF))
822		FD_SET(c->rfd, readset);
823	if (c->ostate == CHAN_OUTPUT_OPEN ||
824	    c->ostate == CHAN_OUTPUT_WAIT_DRAIN) {
825		if (buffer_len(&c->output) > 0) {
826			FD_SET(c->wfd, writeset);
827		} else if (c->ostate == CHAN_OUTPUT_WAIT_DRAIN) {
828			if (CHANNEL_EFD_OUTPUT_ACTIVE(c))
829				debug2("channel %d: obuf_empty delayed efd %d/(%d)",
830				    c->self, c->efd, buffer_len(&c->extended));
831			else
832				chan_obuf_empty(c);
833		}
834	}
835	/** XXX check close conditions, too */
836	if (compat20 && c->efd != -1 &&
837	    !(c->istate == CHAN_INPUT_CLOSED && c->ostate == CHAN_OUTPUT_CLOSED)) {
838		if (c->extended_usage == CHAN_EXTENDED_WRITE &&
839		    buffer_len(&c->extended) > 0)
840			FD_SET(c->efd, writeset);
841		else if (!(c->flags & CHAN_EOF_SENT) &&
842		    c->extended_usage == CHAN_EXTENDED_READ &&
843		    buffer_len(&c->extended) < c->remote_window)
844			FD_SET(c->efd, readset);
845	}
846	/* XXX: What about efd? races? */
847}
848
849/* ARGSUSED */
850static void
851channel_pre_input_draining(Channel *c, fd_set *readset, fd_set *writeset)
852{
853	if (buffer_len(&c->input) == 0) {
854		packet_start(SSH_MSG_CHANNEL_CLOSE);
855		packet_put_int(c->remote_id);
856		packet_send();
857		c->type = SSH_CHANNEL_CLOSED;
858		debug2("channel %d: closing after input drain.", c->self);
859	}
860}
861
862/* ARGSUSED */
863static void
864channel_pre_output_draining(Channel *c, fd_set *readset, fd_set *writeset)
865{
866	if (buffer_len(&c->output) == 0)
867		chan_mark_dead(c);
868	else
869		FD_SET(c->sock, writeset);
870}
871
872/*
873 * This is a special state for X11 authentication spoofing.  An opened X11
874 * connection (when authentication spoofing is being done) remains in this
875 * state until the first packet has been completely read.  The authentication
876 * data in that packet is then substituted by the real data if it matches the
877 * fake data, and the channel is put into normal mode.
878 * XXX All this happens at the client side.
879 * Returns: 0 = need more data, -1 = wrong cookie, 1 = ok
880 */
881static int
882x11_open_helper(Buffer *b)
883{
884	u_char *ucp;
885	u_int proto_len, data_len;
886
887	/* Check if the fixed size part of the packet is in buffer. */
888	if (buffer_len(b) < 12)
889		return 0;
890
891	/* Parse the lengths of variable-length fields. */
892	ucp = buffer_ptr(b);
893	if (ucp[0] == 0x42) {	/* Byte order MSB first. */
894		proto_len = 256 * ucp[6] + ucp[7];
895		data_len = 256 * ucp[8] + ucp[9];
896	} else if (ucp[0] == 0x6c) {	/* Byte order LSB first. */
897		proto_len = ucp[6] + 256 * ucp[7];
898		data_len = ucp[8] + 256 * ucp[9];
899	} else {
900		debug2("Initial X11 packet contains bad byte order byte: 0x%x",
901		    ucp[0]);
902		return -1;
903	}
904
905	/* Check if the whole packet is in buffer. */
906	if (buffer_len(b) <
907	    12 + ((proto_len + 3) & ~3) + ((data_len + 3) & ~3))
908		return 0;
909
910	/* Check if authentication protocol matches. */
911	if (proto_len != strlen(x11_saved_proto) ||
912	    memcmp(ucp + 12, x11_saved_proto, proto_len) != 0) {
913		debug2("X11 connection uses different authentication protocol.");
914		return -1;
915	}
916	/* Check if authentication data matches our fake data. */
917	if (data_len != x11_fake_data_len ||
918	    memcmp(ucp + 12 + ((proto_len + 3) & ~3),
919		x11_fake_data, x11_fake_data_len) != 0) {
920		debug2("X11 auth data does not match fake data.");
921		return -1;
922	}
923	/* Check fake data length */
924	if (x11_fake_data_len != x11_saved_data_len) {
925		error("X11 fake_data_len %d != saved_data_len %d",
926		    x11_fake_data_len, x11_saved_data_len);
927		return -1;
928	}
929	/*
930	 * Received authentication protocol and data match
931	 * our fake data. Substitute the fake data with real
932	 * data.
933	 */
934	memcpy(ucp + 12 + ((proto_len + 3) & ~3),
935	    x11_saved_data, x11_saved_data_len);
936	return 1;
937}
938
939static void
940channel_pre_x11_open_13(Channel *c, fd_set *readset, fd_set *writeset)
941{
942	int ret = x11_open_helper(&c->output);
943
944	if (ret == 1) {
945		/* Start normal processing for the channel. */
946		c->type = SSH_CHANNEL_OPEN;
947		channel_pre_open_13(c, readset, writeset);
948	} else if (ret == -1) {
949		/*
950		 * We have received an X11 connection that has bad
951		 * authentication information.
952		 */
953		logit("X11 connection rejected because of wrong authentication.");
954		buffer_clear(&c->input);
955		buffer_clear(&c->output);
956		channel_close_fd(&c->sock);
957		c->sock = -1;
958		c->type = SSH_CHANNEL_CLOSED;
959		packet_start(SSH_MSG_CHANNEL_CLOSE);
960		packet_put_int(c->remote_id);
961		packet_send();
962	}
963}
964
965static void
966channel_pre_x11_open(Channel *c, fd_set *readset, fd_set *writeset)
967{
968	int ret = x11_open_helper(&c->output);
969
970	/* c->force_drain = 1; */
971
972	if (ret == 1) {
973		c->type = SSH_CHANNEL_OPEN;
974		channel_pre_open(c, readset, writeset);
975	} else if (ret == -1) {
976		logit("X11 connection rejected because of wrong authentication.");
977		debug2("X11 rejected %d i%d/o%d", c->self, c->istate, c->ostate);
978		chan_read_failed(c);
979		buffer_clear(&c->input);
980		chan_ibuf_empty(c);
981		buffer_clear(&c->output);
982		/* for proto v1, the peer will send an IEOF */
983		if (compat20)
984			chan_write_failed(c);
985		else
986			c->type = SSH_CHANNEL_OPEN;
987		debug2("X11 closed %d i%d/o%d", c->self, c->istate, c->ostate);
988	}
989}
990
991static void
992channel_pre_mux_client(Channel *c, fd_set *readset, fd_set *writeset)
993{
994	if (c->istate == CHAN_INPUT_OPEN &&
995	    buffer_check_alloc(&c->input, CHAN_RBUF))
996		FD_SET(c->rfd, readset);
997	if (c->istate == CHAN_INPUT_WAIT_DRAIN) {
998		/* clear buffer immediately (discard any partial packet) */
999		buffer_clear(&c->input);
1000		chan_ibuf_empty(c);
1001		/* Start output drain. XXX just kill chan? */
1002		chan_rcvd_oclose(c);
1003	}
1004	if (c->ostate == CHAN_OUTPUT_OPEN ||
1005	    c->ostate == CHAN_OUTPUT_WAIT_DRAIN) {
1006		if (buffer_len(&c->output) > 0)
1007			FD_SET(c->wfd, writeset);
1008		else if (c->ostate == CHAN_OUTPUT_WAIT_DRAIN)
1009			chan_obuf_empty(c);
1010	}
1011}
1012
1013/* try to decode a socks4 header */
1014/* ARGSUSED */
1015static int
1016channel_decode_socks4(Channel *c, fd_set *readset, fd_set *writeset)
1017{
1018	char *p, *host;
1019	u_int len, have, i, found, need;
1020	char username[256];
1021	struct {
1022		u_int8_t version;
1023		u_int8_t command;
1024		u_int16_t dest_port;
1025		struct in_addr dest_addr;
1026	} s4_req, s4_rsp;
1027
1028	debug2("channel %d: decode socks4", c->self);
1029
1030	have = buffer_len(&c->input);
1031	len = sizeof(s4_req);
1032	if (have < len)
1033		return 0;
1034	p = buffer_ptr(&c->input);
1035
1036	need = 1;
1037	/* SOCKS4A uses an invalid IP address 0.0.0.x */
1038	if (p[4] == 0 && p[5] == 0 && p[6] == 0 && p[7] != 0) {
1039		debug2("channel %d: socks4a request", c->self);
1040		/* ... and needs an extra string (the hostname) */
1041		need = 2;
1042	}
1043	/* Check for terminating NUL on the string(s) */
1044	for (found = 0, i = len; i < have; i++) {
1045		if (p[i] == '\0') {
1046			found++;
1047			if (found == need)
1048				break;
1049		}
1050		if (i > 1024) {
1051			/* the peer is probably sending garbage */
1052			debug("channel %d: decode socks4: too long",
1053			    c->self);
1054			return -1;
1055		}
1056	}
1057	if (found < need)
1058		return 0;
1059	buffer_get(&c->input, (char *)&s4_req.version, 1);
1060	buffer_get(&c->input, (char *)&s4_req.command, 1);
1061	buffer_get(&c->input, (char *)&s4_req.dest_port, 2);
1062	buffer_get(&c->input, (char *)&s4_req.dest_addr, 4);
1063	have = buffer_len(&c->input);
1064	p = buffer_ptr(&c->input);
1065	len = strlen(p);
1066	debug2("channel %d: decode socks4: user %s/%d", c->self, p, len);
1067	len++;					/* trailing '\0' */
1068	if (len > have)
1069		fatal("channel %d: decode socks4: len %d > have %d",
1070		    c->self, len, have);
1071	strlcpy(username, p, sizeof(username));
1072	buffer_consume(&c->input, len);
1073
1074	if (c->path != NULL) {
1075		xfree(c->path);
1076		c->path = NULL;
1077	}
1078	if (need == 1) {			/* SOCKS4: one string */
1079		host = inet_ntoa(s4_req.dest_addr);
1080		c->path = xstrdup(host);
1081	} else {				/* SOCKS4A: two strings */
1082		have = buffer_len(&c->input);
1083		p = buffer_ptr(&c->input);
1084		len = strlen(p);
1085		debug2("channel %d: decode socks4a: host %s/%d",
1086		    c->self, p, len);
1087		len++;				/* trailing '\0' */
1088		if (len > have)
1089			fatal("channel %d: decode socks4a: len %d > have %d",
1090			    c->self, len, have);
1091		if (len > NI_MAXHOST) {
1092			error("channel %d: hostname \"%.100s\" too long",
1093			    c->self, p);
1094			return -1;
1095		}
1096		c->path = xstrdup(p);
1097		buffer_consume(&c->input, len);
1098	}
1099	c->host_port = ntohs(s4_req.dest_port);
1100
1101	debug2("channel %d: dynamic request: socks4 host %s port %u command %u",
1102	    c->self, c->path, c->host_port, s4_req.command);
1103
1104	if (s4_req.command != 1) {
1105		debug("channel %d: cannot handle: %s cn %d",
1106		    c->self, need == 1 ? "SOCKS4" : "SOCKS4A", s4_req.command);
1107		return -1;
1108	}
1109	s4_rsp.version = 0;			/* vn: 0 for reply */
1110	s4_rsp.command = 90;			/* cd: req granted */
1111	s4_rsp.dest_port = 0;			/* ignored */
1112	s4_rsp.dest_addr.s_addr = INADDR_ANY;	/* ignored */
1113	buffer_append(&c->output, &s4_rsp, sizeof(s4_rsp));
1114	return 1;
1115}
1116
1117/* try to decode a socks5 header */
1118#define SSH_SOCKS5_AUTHDONE	0x1000
1119#define SSH_SOCKS5_NOAUTH	0x00
1120#define SSH_SOCKS5_IPV4		0x01
1121#define SSH_SOCKS5_DOMAIN	0x03
1122#define SSH_SOCKS5_IPV6		0x04
1123#define SSH_SOCKS5_CONNECT	0x01
1124#define SSH_SOCKS5_SUCCESS	0x00
1125
1126/* ARGSUSED */
1127static int
1128channel_decode_socks5(Channel *c, fd_set *readset, fd_set *writeset)
1129{
1130	struct {
1131		u_int8_t version;
1132		u_int8_t command;
1133		u_int8_t reserved;
1134		u_int8_t atyp;
1135	} s5_req, s5_rsp;
1136	u_int16_t dest_port;
1137	u_char *p, dest_addr[255+1], ntop[INET6_ADDRSTRLEN];
1138	u_int have, need, i, found, nmethods, addrlen, af;
1139
1140	debug2("channel %d: decode socks5", c->self);
1141	p = buffer_ptr(&c->input);
1142	if (p[0] != 0x05)
1143		return -1;
1144	have = buffer_len(&c->input);
1145	if (!(c->flags & SSH_SOCKS5_AUTHDONE)) {
1146		/* format: ver | nmethods | methods */
1147		if (have < 2)
1148			return 0;
1149		nmethods = p[1];
1150		if (have < nmethods + 2)
1151			return 0;
1152		/* look for method: "NO AUTHENTICATION REQUIRED" */
1153		for (found = 0, i = 2; i < nmethods + 2; i++) {
1154			if (p[i] == SSH_SOCKS5_NOAUTH) {
1155				found = 1;
1156				break;
1157			}
1158		}
1159		if (!found) {
1160			debug("channel %d: method SSH_SOCKS5_NOAUTH not found",
1161			    c->self);
1162			return -1;
1163		}
1164		buffer_consume(&c->input, nmethods + 2);
1165		buffer_put_char(&c->output, 0x05);		/* version */
1166		buffer_put_char(&c->output, SSH_SOCKS5_NOAUTH);	/* method */
1167		FD_SET(c->sock, writeset);
1168		c->flags |= SSH_SOCKS5_AUTHDONE;
1169		debug2("channel %d: socks5 auth done", c->self);
1170		return 0;				/* need more */
1171	}
1172	debug2("channel %d: socks5 post auth", c->self);
1173	if (have < sizeof(s5_req)+1)
1174		return 0;			/* need more */
1175	memcpy(&s5_req, p, sizeof(s5_req));
1176	if (s5_req.version != 0x05 ||
1177	    s5_req.command != SSH_SOCKS5_CONNECT ||
1178	    s5_req.reserved != 0x00) {
1179		debug2("channel %d: only socks5 connect supported", c->self);
1180		return -1;
1181	}
1182	switch (s5_req.atyp){
1183	case SSH_SOCKS5_IPV4:
1184		addrlen = 4;
1185		af = AF_INET;
1186		break;
1187	case SSH_SOCKS5_DOMAIN:
1188		addrlen = p[sizeof(s5_req)];
1189		af = -1;
1190		break;
1191	case SSH_SOCKS5_IPV6:
1192		addrlen = 16;
1193		af = AF_INET6;
1194		break;
1195	default:
1196		debug2("channel %d: bad socks5 atyp %d", c->self, s5_req.atyp);
1197		return -1;
1198	}
1199	need = sizeof(s5_req) + addrlen + 2;
1200	if (s5_req.atyp == SSH_SOCKS5_DOMAIN)
1201		need++;
1202	if (have < need)
1203		return 0;
1204	buffer_consume(&c->input, sizeof(s5_req));
1205	if (s5_req.atyp == SSH_SOCKS5_DOMAIN)
1206		buffer_consume(&c->input, 1);    /* host string length */
1207	buffer_get(&c->input, (char *)&dest_addr, addrlen);
1208	buffer_get(&c->input, (char *)&dest_port, 2);
1209	dest_addr[addrlen] = '\0';
1210	if (c->path != NULL) {
1211		xfree(c->path);
1212		c->path = NULL;
1213	}
1214	if (s5_req.atyp == SSH_SOCKS5_DOMAIN) {
1215		if (addrlen >= NI_MAXHOST) {
1216			error("channel %d: dynamic request: socks5 hostname "
1217			    "\"%.100s\" too long", c->self, dest_addr);
1218			return -1;
1219		}
1220		c->path = xstrdup(dest_addr);
1221	} else {
1222		if (inet_ntop(af, dest_addr, ntop, sizeof(ntop)) == NULL)
1223			return -1;
1224		c->path = xstrdup(ntop);
1225	}
1226	c->host_port = ntohs(dest_port);
1227
1228	debug2("channel %d: dynamic request: socks5 host %s port %u command %u",
1229	    c->self, c->path, c->host_port, s5_req.command);
1230
1231	s5_rsp.version = 0x05;
1232	s5_rsp.command = SSH_SOCKS5_SUCCESS;
1233	s5_rsp.reserved = 0;			/* ignored */
1234	s5_rsp.atyp = SSH_SOCKS5_IPV4;
1235	((struct in_addr *)&dest_addr)->s_addr = INADDR_ANY;
1236	dest_port = 0;				/* ignored */
1237
1238	buffer_append(&c->output, &s5_rsp, sizeof(s5_rsp));
1239	buffer_append(&c->output, &dest_addr, sizeof(struct in_addr));
1240	buffer_append(&c->output, &dest_port, sizeof(dest_port));
1241	return 1;
1242}
1243
1244Channel *
1245channel_connect_stdio_fwd(const char *host_to_connect, u_short port_to_connect,
1246    int in, int out)
1247{
1248	Channel *c;
1249
1250	debug("channel_connect_stdio_fwd %s:%d", host_to_connect,
1251	    port_to_connect);
1252
1253	c = channel_new("stdio-forward", SSH_CHANNEL_OPENING, in, out,
1254	    -1, CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT,
1255	    0, "stdio-forward", /*nonblock*/0);
1256
1257	c->path = xstrdup(host_to_connect);
1258	c->host_port = port_to_connect;
1259	c->listening_port = 0;
1260	c->force_drain = 1;
1261
1262	channel_register_fds(c, in, out, -1, 0, 1, 0);
1263	port_open_helper(c, "direct-tcpip");
1264
1265	return c;
1266}
1267
1268/* dynamic port forwarding */
1269static void
1270channel_pre_dynamic(Channel *c, fd_set *readset, fd_set *writeset)
1271{
1272	u_char *p;
1273	u_int have;
1274	int ret;
1275
1276	have = buffer_len(&c->input);
1277	debug2("channel %d: pre_dynamic: have %d", c->self, have);
1278	/* buffer_dump(&c->input); */
1279	/* check if the fixed size part of the packet is in buffer. */
1280	if (have < 3) {
1281		/* need more */
1282		FD_SET(c->sock, readset);
1283		return;
1284	}
1285	/* try to guess the protocol */
1286	p = buffer_ptr(&c->input);
1287	switch (p[0]) {
1288	case 0x04:
1289		ret = channel_decode_socks4(c, readset, writeset);
1290		break;
1291	case 0x05:
1292		ret = channel_decode_socks5(c, readset, writeset);
1293		break;
1294	default:
1295		ret = -1;
1296		break;
1297	}
1298	if (ret < 0) {
1299		chan_mark_dead(c);
1300	} else if (ret == 0) {
1301		debug2("channel %d: pre_dynamic: need more", c->self);
1302		/* need more */
1303		FD_SET(c->sock, readset);
1304	} else {
1305		/* switch to the next state */
1306		c->type = SSH_CHANNEL_OPENING;
1307		port_open_helper(c, "direct-tcpip");
1308	}
1309}
1310
1311/* This is our fake X11 server socket. */
1312/* ARGSUSED */
1313static void
1314channel_post_x11_listener(Channel *c, fd_set *readset, fd_set *writeset)
1315{
1316	Channel *nc;
1317	struct sockaddr_storage addr;
1318	int newsock;
1319	socklen_t addrlen;
1320	char buf[16384], *remote_ipaddr;
1321	int remote_port;
1322
1323	if (FD_ISSET(c->sock, readset)) {
1324		debug("X11 connection requested.");
1325		addrlen = sizeof(addr);
1326		newsock = accept(c->sock, (struct sockaddr *)&addr, &addrlen);
1327		if (c->single_connection) {
1328			debug2("single_connection: closing X11 listener.");
1329			channel_close_fd(&c->sock);
1330			chan_mark_dead(c);
1331		}
1332		if (newsock < 0) {
1333			error("accept: %.100s", strerror(errno));
1334			return;
1335		}
1336		set_nodelay(newsock);
1337		remote_ipaddr = get_peer_ipaddr(newsock);
1338		remote_port = get_peer_port(newsock);
1339		snprintf(buf, sizeof buf, "X11 connection from %.200s port %d",
1340		    remote_ipaddr, remote_port);
1341
1342		nc = channel_new("accepted x11 socket",
1343		    SSH_CHANNEL_OPENING, newsock, newsock, -1,
1344		    c->local_window_max, c->local_maxpacket, 0, buf, 1);
1345		if (compat20) {
1346			packet_start(SSH2_MSG_CHANNEL_OPEN);
1347			packet_put_cstring("x11");
1348			packet_put_int(nc->self);
1349			packet_put_int(nc->local_window_max);
1350			packet_put_int(nc->local_maxpacket);
1351			/* originator ipaddr and port */
1352			packet_put_cstring(remote_ipaddr);
1353			if (datafellows & SSH_BUG_X11FWD) {
1354				debug2("ssh2 x11 bug compat mode");
1355			} else {
1356				packet_put_int(remote_port);
1357			}
1358			packet_send();
1359		} else {
1360			packet_start(SSH_SMSG_X11_OPEN);
1361			packet_put_int(nc->self);
1362			if (packet_get_protocol_flags() &
1363			    SSH_PROTOFLAG_HOST_IN_FWD_OPEN)
1364				packet_put_cstring(buf);
1365			packet_send();
1366		}
1367		xfree(remote_ipaddr);
1368	}
1369}
1370
1371static void
1372port_open_helper(Channel *c, char *rtype)
1373{
1374	int direct;
1375	char buf[1024];
1376	char *remote_ipaddr = get_peer_ipaddr(c->sock);
1377	int remote_port = get_peer_port(c->sock);
1378
1379	if (remote_port == -1) {
1380		/* Fake addr/port to appease peers that validate it (Tectia) */
1381		xfree(remote_ipaddr);
1382		remote_ipaddr = xstrdup("127.0.0.1");
1383		remote_port = 65535;
1384	}
1385
1386	direct = (strcmp(rtype, "direct-tcpip") == 0);
1387
1388	snprintf(buf, sizeof buf,
1389	    "%s: listening port %d for %.100s port %d, "
1390	    "connect from %.200s port %d",
1391	    rtype, c->listening_port, c->path, c->host_port,
1392	    remote_ipaddr, remote_port);
1393
1394	xfree(c->remote_name);
1395	c->remote_name = xstrdup(buf);
1396
1397	if (compat20) {
1398		packet_start(SSH2_MSG_CHANNEL_OPEN);
1399		packet_put_cstring(rtype);
1400		packet_put_int(c->self);
1401		packet_put_int(c->local_window_max);
1402		packet_put_int(c->local_maxpacket);
1403		if (direct) {
1404			/* target host, port */
1405			packet_put_cstring(c->path);
1406			packet_put_int(c->host_port);
1407		} else {
1408			/* listen address, port */
1409			packet_put_cstring(c->path);
1410			packet_put_int(c->listening_port);
1411		}
1412		/* originator host and port */
1413		packet_put_cstring(remote_ipaddr);
1414		packet_put_int((u_int)remote_port);
1415		packet_send();
1416	} else {
1417		packet_start(SSH_MSG_PORT_OPEN);
1418		packet_put_int(c->self);
1419		packet_put_cstring(c->path);
1420		packet_put_int(c->host_port);
1421		if (packet_get_protocol_flags() &
1422		    SSH_PROTOFLAG_HOST_IN_FWD_OPEN)
1423			packet_put_cstring(c->remote_name);
1424		packet_send();
1425	}
1426	xfree(remote_ipaddr);
1427}
1428
1429static void
1430channel_set_reuseaddr(int fd)
1431{
1432	int on = 1;
1433
1434	/*
1435	 * Set socket options.
1436	 * Allow local port reuse in TIME_WAIT.
1437	 */
1438	if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1)
1439		error("setsockopt SO_REUSEADDR fd %d: %s", fd, strerror(errno));
1440}
1441
1442/*
1443 * This socket is listening for connections to a forwarded TCP/IP port.
1444 */
1445/* ARGSUSED */
1446static void
1447channel_post_port_listener(Channel *c, fd_set *readset, fd_set *writeset)
1448{
1449	Channel *nc;
1450	struct sockaddr_storage addr;
1451	int newsock, nextstate;
1452	socklen_t addrlen;
1453	char *rtype;
1454
1455	if (FD_ISSET(c->sock, readset)) {
1456		debug("Connection to port %d forwarding "
1457		    "to %.100s port %d requested.",
1458		    c->listening_port, c->path, c->host_port);
1459
1460		if (c->type == SSH_CHANNEL_RPORT_LISTENER) {
1461			nextstate = SSH_CHANNEL_OPENING;
1462			rtype = "forwarded-tcpip";
1463		} else {
1464			if (c->host_port == 0) {
1465				nextstate = SSH_CHANNEL_DYNAMIC;
1466				rtype = "dynamic-tcpip";
1467			} else {
1468				nextstate = SSH_CHANNEL_OPENING;
1469				rtype = "direct-tcpip";
1470			}
1471		}
1472
1473		addrlen = sizeof(addr);
1474		newsock = accept(c->sock, (struct sockaddr *)&addr, &addrlen);
1475		if (newsock < 0) {
1476			error("accept: %.100s", strerror(errno));
1477			return;
1478		}
1479		set_nodelay(newsock);
1480		nc = channel_new(rtype, nextstate, newsock, newsock, -1,
1481		    c->local_window_max, c->local_maxpacket, 0, rtype, 1);
1482		nc->listening_port = c->listening_port;
1483		nc->host_port = c->host_port;
1484		if (c->path != NULL)
1485			nc->path = xstrdup(c->path);
1486
1487		if (nextstate != SSH_CHANNEL_DYNAMIC)
1488			port_open_helper(nc, rtype);
1489	}
1490}
1491
1492/*
1493 * This is the authentication agent socket listening for connections from
1494 * clients.
1495 */
1496/* ARGSUSED */
1497static void
1498channel_post_auth_listener(Channel *c, fd_set *readset, fd_set *writeset)
1499{
1500	Channel *nc;
1501	int newsock;
1502	struct sockaddr_storage addr;
1503	socklen_t addrlen;
1504
1505	if (FD_ISSET(c->sock, readset)) {
1506		addrlen = sizeof(addr);
1507		newsock = accept(c->sock, (struct sockaddr *)&addr, &addrlen);
1508		if (newsock < 0) {
1509			error("accept from auth socket: %.100s", strerror(errno));
1510			return;
1511		}
1512		nc = channel_new("accepted auth socket",
1513		    SSH_CHANNEL_OPENING, newsock, newsock, -1,
1514		    c->local_window_max, c->local_maxpacket,
1515		    0, "accepted auth socket", 1);
1516		if (compat20) {
1517			packet_start(SSH2_MSG_CHANNEL_OPEN);
1518			packet_put_cstring("auth-agent@openssh.com");
1519			packet_put_int(nc->self);
1520			packet_put_int(c->local_window_max);
1521			packet_put_int(c->local_maxpacket);
1522		} else {
1523			packet_start(SSH_SMSG_AGENT_OPEN);
1524			packet_put_int(nc->self);
1525		}
1526		packet_send();
1527	}
1528}
1529
1530/* ARGSUSED */
1531static void
1532channel_post_connecting(Channel *c, fd_set *readset, fd_set *writeset)
1533{
1534	int err = 0, sock;
1535	socklen_t sz = sizeof(err);
1536
1537	if (FD_ISSET(c->sock, writeset)) {
1538		if (getsockopt(c->sock, SOL_SOCKET, SO_ERROR, &err, &sz) < 0) {
1539			err = errno;
1540			error("getsockopt SO_ERROR failed");
1541		}
1542		if (err == 0) {
1543			debug("channel %d: connected to %s port %d",
1544			    c->self, c->connect_ctx.host, c->connect_ctx.port);
1545			channel_connect_ctx_free(&c->connect_ctx);
1546			c->type = SSH_CHANNEL_OPEN;
1547			if (compat20) {
1548				packet_start(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION);
1549				packet_put_int(c->remote_id);
1550				packet_put_int(c->self);
1551				packet_put_int(c->local_window);
1552				packet_put_int(c->local_maxpacket);
1553			} else {
1554				packet_start(SSH_MSG_CHANNEL_OPEN_CONFIRMATION);
1555				packet_put_int(c->remote_id);
1556				packet_put_int(c->self);
1557			}
1558		} else {
1559			debug("channel %d: connection failed: %s",
1560			    c->self, strerror(err));
1561			/* Try next address, if any */
1562			if ((sock = connect_next(&c->connect_ctx)) > 0) {
1563				close(c->sock);
1564				c->sock = c->rfd = c->wfd = sock;
1565				channel_max_fd = channel_find_maxfd();
1566				return;
1567			}
1568			/* Exhausted all addresses */
1569			error("connect_to %.100s port %d: failed.",
1570			    c->connect_ctx.host, c->connect_ctx.port);
1571			channel_connect_ctx_free(&c->connect_ctx);
1572			if (compat20) {
1573				packet_start(SSH2_MSG_CHANNEL_OPEN_FAILURE);
1574				packet_put_int(c->remote_id);
1575				packet_put_int(SSH2_OPEN_CONNECT_FAILED);
1576				if (!(datafellows & SSH_BUG_OPENFAILURE)) {
1577					packet_put_cstring(strerror(err));
1578					packet_put_cstring("");
1579				}
1580			} else {
1581				packet_start(SSH_MSG_CHANNEL_OPEN_FAILURE);
1582				packet_put_int(c->remote_id);
1583			}
1584			chan_mark_dead(c);
1585		}
1586		packet_send();
1587	}
1588}
1589
1590/* ARGSUSED */
1591static int
1592channel_handle_rfd(Channel *c, fd_set *readset, fd_set *writeset)
1593{
1594	char buf[CHAN_RBUF];
1595	int len, force;
1596
1597	force = c->isatty && c->detach_close && c->istate != CHAN_INPUT_CLOSED;
1598	if (c->rfd != -1 && (force || FD_ISSET(c->rfd, readset))) {
1599		errno = 0;
1600		len = read(c->rfd, buf, sizeof(buf));
1601		if (len < 0 && (errno == EINTR ||
1602		    ((errno == EAGAIN || errno == EWOULDBLOCK) && !force)))
1603			return 1;
1604#ifndef PTY_ZEROREAD
1605		if (len <= 0) {
1606#else
1607		if ((!c->isatty && len <= 0) ||
1608		    (c->isatty && (len < 0 || (len == 0 && errno != 0)))) {
1609#endif
1610			debug2("channel %d: read<=0 rfd %d len %d",
1611			    c->self, c->rfd, len);
1612			if (c->type != SSH_CHANNEL_OPEN) {
1613				debug2("channel %d: not open", c->self);
1614				chan_mark_dead(c);
1615				return -1;
1616			} else if (compat13) {
1617				buffer_clear(&c->output);
1618				c->type = SSH_CHANNEL_INPUT_DRAINING;
1619				debug2("channel %d: input draining.", c->self);
1620			} else {
1621				chan_read_failed(c);
1622			}
1623			return -1;
1624		}
1625		if (c->input_filter != NULL) {
1626			if (c->input_filter(c, buf, len) == -1) {
1627				debug2("channel %d: filter stops", c->self);
1628				chan_read_failed(c);
1629			}
1630		} else if (c->datagram) {
1631			buffer_put_string(&c->input, buf, len);
1632		} else {
1633			buffer_append(&c->input, buf, len);
1634		}
1635	}
1636	return 1;
1637}
1638
1639/* ARGSUSED */
1640static int
1641channel_handle_wfd(Channel *c, fd_set *readset, fd_set *writeset)
1642{
1643	struct termios tio;
1644	u_char *data = NULL, *buf;
1645	u_int dlen;
1646	int len;
1647
1648	/* Send buffered output data to the socket. */
1649	if (c->wfd != -1 &&
1650	    FD_ISSET(c->wfd, writeset) &&
1651	    buffer_len(&c->output) > 0) {
1652		if (c->output_filter != NULL) {
1653			if ((buf = c->output_filter(c, &data, &dlen)) == NULL) {
1654				debug2("channel %d: filter stops", c->self);
1655				if (c->type != SSH_CHANNEL_OPEN)
1656					chan_mark_dead(c);
1657				else
1658					chan_write_failed(c);
1659				return -1;
1660			}
1661		} else if (c->datagram) {
1662			buf = data = buffer_get_string(&c->output, &dlen);
1663		} else {
1664			buf = data = buffer_ptr(&c->output);
1665			dlen = buffer_len(&c->output);
1666		}
1667
1668		if (c->datagram) {
1669			/* ignore truncated writes, datagrams might get lost */
1670			c->local_consumed += dlen + 4;
1671			len = write(c->wfd, buf, dlen);
1672			xfree(data);
1673			if (len < 0 && (errno == EINTR || errno == EAGAIN ||
1674			    errno == EWOULDBLOCK))
1675				return 1;
1676			if (len <= 0) {
1677				if (c->type != SSH_CHANNEL_OPEN)
1678					chan_mark_dead(c);
1679				else
1680					chan_write_failed(c);
1681				return -1;
1682			}
1683			return 1;
1684		}
1685#ifdef _AIX
1686		/* XXX: Later AIX versions can't push as much data to tty */
1687		if (compat20 && c->wfd_isatty)
1688			dlen = MIN(dlen, 8*1024);
1689#endif
1690
1691		len = write(c->wfd, buf, dlen);
1692		if (len < 0 &&
1693		    (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK))
1694			return 1;
1695		if (len <= 0) {
1696			if (c->type != SSH_CHANNEL_OPEN) {
1697				debug2("channel %d: not open", c->self);
1698				chan_mark_dead(c);
1699				return -1;
1700			} else if (compat13) {
1701				buffer_clear(&c->output);
1702				debug2("channel %d: input draining.", c->self);
1703				c->type = SSH_CHANNEL_INPUT_DRAINING;
1704			} else {
1705				chan_write_failed(c);
1706			}
1707			return -1;
1708		}
1709#ifndef BROKEN_TCGETATTR_ICANON
1710		if (compat20 && c->isatty && dlen >= 1 && buf[0] != '\r') {
1711			if (tcgetattr(c->wfd, &tio) == 0 &&
1712			    !(tio.c_lflag & ECHO) && (tio.c_lflag & ICANON)) {
1713				/*
1714				 * Simulate echo to reduce the impact of
1715				 * traffic analysis. We need to match the
1716				 * size of a SSH2_MSG_CHANNEL_DATA message
1717				 * (4 byte channel id + buf)
1718				 */
1719				packet_send_ignore(4 + len);
1720				packet_send();
1721			}
1722		}
1723#endif
1724		buffer_consume(&c->output, len);
1725		if (compat20 && len > 0) {
1726			c->local_consumed += len;
1727		}
1728	}
1729	return 1;
1730}
1731
1732static int
1733channel_handle_efd(Channel *c, fd_set *readset, fd_set *writeset)
1734{
1735	char buf[CHAN_RBUF];
1736	int len;
1737
1738/** XXX handle drain efd, too */
1739	if (c->efd != -1) {
1740		if (c->extended_usage == CHAN_EXTENDED_WRITE &&
1741		    FD_ISSET(c->efd, writeset) &&
1742		    buffer_len(&c->extended) > 0) {
1743			len = write(c->efd, buffer_ptr(&c->extended),
1744			    buffer_len(&c->extended));
1745			debug2("channel %d: written %d to efd %d",
1746			    c->self, len, c->efd);
1747			if (len < 0 && (errno == EINTR || errno == EAGAIN ||
1748			    errno == EWOULDBLOCK))
1749				return 1;
1750			if (len <= 0) {
1751				debug2("channel %d: closing write-efd %d",
1752				    c->self, c->efd);
1753				channel_close_fd(&c->efd);
1754			} else {
1755				buffer_consume(&c->extended, len);
1756				c->local_consumed += len;
1757			}
1758		} else if (c->extended_usage == CHAN_EXTENDED_READ &&
1759		    (c->detach_close || FD_ISSET(c->efd, readset))) {
1760			len = read(c->efd, buf, sizeof(buf));
1761			debug2("channel %d: read %d from efd %d",
1762			    c->self, len, c->efd);
1763			if (len < 0 && (errno == EINTR || ((errno == EAGAIN ||
1764			    errno == EWOULDBLOCK) && !c->detach_close)))
1765				return 1;
1766			if (len <= 0) {
1767				debug2("channel %d: closing read-efd %d",
1768				    c->self, c->efd);
1769				channel_close_fd(&c->efd);
1770			} else {
1771				buffer_append(&c->extended, buf, len);
1772			}
1773		}
1774	}
1775	return 1;
1776}
1777
1778static int
1779channel_check_window(Channel *c)
1780{
1781	if (c->type == SSH_CHANNEL_OPEN &&
1782	    !(c->flags & (CHAN_CLOSE_SENT|CHAN_CLOSE_RCVD)) &&
1783	    ((c->local_window_max - c->local_window >
1784	    c->local_maxpacket*3) ||
1785	    c->local_window < c->local_window_max/2) &&
1786	    c->local_consumed > 0) {
1787		packet_start(SSH2_MSG_CHANNEL_WINDOW_ADJUST);
1788		packet_put_int(c->remote_id);
1789		packet_put_int(c->local_consumed);
1790		packet_send();
1791		debug2("channel %d: window %d sent adjust %d",
1792		    c->self, c->local_window,
1793		    c->local_consumed);
1794		c->local_window += c->local_consumed;
1795		c->local_consumed = 0;
1796	}
1797	return 1;
1798}
1799
1800static void
1801channel_post_open(Channel *c, fd_set *readset, fd_set *writeset)
1802{
1803	channel_handle_rfd(c, readset, writeset);
1804	channel_handle_wfd(c, readset, writeset);
1805	if (!compat20)
1806		return;
1807	channel_handle_efd(c, readset, writeset);
1808	channel_check_window(c);
1809}
1810
1811static u_int
1812read_mux(Channel *c, u_int need)
1813{
1814	char buf[CHAN_RBUF];
1815	int len;
1816	u_int rlen;
1817
1818	if (buffer_len(&c->input) < need) {
1819		rlen = need - buffer_len(&c->input);
1820		len = read(c->rfd, buf, MIN(rlen, CHAN_RBUF));
1821		if (len <= 0) {
1822			if (errno != EINTR && errno != EAGAIN) {
1823				debug2("channel %d: ctl read<=0 rfd %d len %d",
1824				    c->self, c->rfd, len);
1825				chan_read_failed(c);
1826				return 0;
1827			}
1828		} else
1829			buffer_append(&c->input, buf, len);
1830	}
1831	return buffer_len(&c->input);
1832}
1833
1834static void
1835channel_post_mux_client(Channel *c, fd_set *readset, fd_set *writeset)
1836{
1837	u_int need;
1838	ssize_t len;
1839
1840	if (!compat20)
1841		fatal("%s: entered with !compat20", __func__);
1842
1843	if (c->rfd != -1 && FD_ISSET(c->rfd, readset) &&
1844	    (c->istate == CHAN_INPUT_OPEN ||
1845	    c->istate == CHAN_INPUT_WAIT_DRAIN)) {
1846		/*
1847		 * Don't not read past the precise end of packets to
1848		 * avoid disrupting fd passing.
1849		 */
1850		if (read_mux(c, 4) < 4) /* read header */
1851			return;
1852		need = get_u32(buffer_ptr(&c->input));
1853#define CHANNEL_MUX_MAX_PACKET	(256 * 1024)
1854		if (need > CHANNEL_MUX_MAX_PACKET) {
1855			debug2("channel %d: packet too big %u > %u",
1856			    c->self, CHANNEL_MUX_MAX_PACKET, need);
1857			chan_rcvd_oclose(c);
1858			return;
1859		}
1860		if (read_mux(c, need + 4) < need + 4) /* read body */
1861			return;
1862		if (c->mux_rcb(c) != 0) {
1863			debug("channel %d: mux_rcb failed", c->self);
1864			chan_mark_dead(c);
1865			return;
1866		}
1867	}
1868
1869	if (c->wfd != -1 && FD_ISSET(c->wfd, writeset) &&
1870	    buffer_len(&c->output) > 0) {
1871		len = write(c->wfd, buffer_ptr(&c->output),
1872		    buffer_len(&c->output));
1873		if (len < 0 && (errno == EINTR || errno == EAGAIN))
1874			return;
1875		if (len <= 0) {
1876			chan_mark_dead(c);
1877			return;
1878		}
1879		buffer_consume(&c->output, len);
1880	}
1881}
1882
1883static void
1884channel_post_mux_listener(Channel *c, fd_set *readset, fd_set *writeset)
1885{
1886	Channel *nc;
1887	struct sockaddr_storage addr;
1888	socklen_t addrlen;
1889	int newsock;
1890	uid_t euid;
1891	gid_t egid;
1892
1893	if (!FD_ISSET(c->sock, readset))
1894		return;
1895
1896	debug("multiplexing control connection");
1897
1898	/*
1899	 * Accept connection on control socket
1900	 */
1901	memset(&addr, 0, sizeof(addr));
1902	addrlen = sizeof(addr);
1903	if ((newsock = accept(c->sock, (struct sockaddr*)&addr,
1904	    &addrlen)) == -1) {
1905		error("%s accept: %s", __func__, strerror(errno));
1906		return;
1907	}
1908
1909	if (getpeereid(newsock, &euid, &egid) < 0) {
1910		error("%s getpeereid failed: %s", __func__,
1911		    strerror(errno));
1912		close(newsock);
1913		return;
1914	}
1915	if ((euid != 0) && (getuid() != euid)) {
1916		error("multiplex uid mismatch: peer euid %u != uid %u",
1917		    (u_int)euid, (u_int)getuid());
1918		close(newsock);
1919		return;
1920	}
1921	nc = channel_new("multiplex client", SSH_CHANNEL_MUX_CLIENT,
1922	    newsock, newsock, -1, c->local_window_max,
1923	    c->local_maxpacket, 0, "mux-control", 1);
1924	nc->mux_rcb = c->mux_rcb;
1925	debug3("%s: new mux channel %d fd %d", __func__,
1926	    nc->self, nc->sock);
1927	/* establish state */
1928	nc->mux_rcb(nc);
1929	/* mux state transitions must not elicit protocol messages */
1930	nc->flags |= CHAN_LOCAL;
1931}
1932
1933/* ARGSUSED */
1934static void
1935channel_post_output_drain_13(Channel *c, fd_set *readset, fd_set *writeset)
1936{
1937	int len;
1938
1939	/* Send buffered output data to the socket. */
1940	if (FD_ISSET(c->sock, writeset) && buffer_len(&c->output) > 0) {
1941		len = write(c->sock, buffer_ptr(&c->output),
1942			    buffer_len(&c->output));
1943		if (len <= 0)
1944			buffer_clear(&c->output);
1945		else
1946			buffer_consume(&c->output, len);
1947	}
1948}
1949
1950static void
1951channel_handler_init_20(void)
1952{
1953	channel_pre[SSH_CHANNEL_OPEN] =			&channel_pre_open;
1954	channel_pre[SSH_CHANNEL_X11_OPEN] =		&channel_pre_x11_open;
1955	channel_pre[SSH_CHANNEL_PORT_LISTENER] =	&channel_pre_listener;
1956	channel_pre[SSH_CHANNEL_RPORT_LISTENER] =	&channel_pre_listener;
1957	channel_pre[SSH_CHANNEL_X11_LISTENER] =		&channel_pre_listener;
1958	channel_pre[SSH_CHANNEL_AUTH_SOCKET] =		&channel_pre_listener;
1959	channel_pre[SSH_CHANNEL_CONNECTING] =		&channel_pre_connecting;
1960	channel_pre[SSH_CHANNEL_DYNAMIC] =		&channel_pre_dynamic;
1961	channel_pre[SSH_CHANNEL_MUX_LISTENER] =		&channel_pre_listener;
1962	channel_pre[SSH_CHANNEL_MUX_CLIENT] =		&channel_pre_mux_client;
1963
1964	channel_post[SSH_CHANNEL_OPEN] =		&channel_post_open;
1965	channel_post[SSH_CHANNEL_PORT_LISTENER] =	&channel_post_port_listener;
1966	channel_post[SSH_CHANNEL_RPORT_LISTENER] =	&channel_post_port_listener;
1967	channel_post[SSH_CHANNEL_X11_LISTENER] =	&channel_post_x11_listener;
1968	channel_post[SSH_CHANNEL_AUTH_SOCKET] =		&channel_post_auth_listener;
1969	channel_post[SSH_CHANNEL_CONNECTING] =		&channel_post_connecting;
1970	channel_post[SSH_CHANNEL_DYNAMIC] =		&channel_post_open;
1971	channel_post[SSH_CHANNEL_MUX_LISTENER] =	&channel_post_mux_listener;
1972	channel_post[SSH_CHANNEL_MUX_CLIENT] =		&channel_post_mux_client;
1973}
1974
1975static void
1976channel_handler_init_13(void)
1977{
1978	channel_pre[SSH_CHANNEL_OPEN] =			&channel_pre_open_13;
1979	channel_pre[SSH_CHANNEL_X11_OPEN] =		&channel_pre_x11_open_13;
1980	channel_pre[SSH_CHANNEL_X11_LISTENER] =		&channel_pre_listener;
1981	channel_pre[SSH_CHANNEL_PORT_LISTENER] =	&channel_pre_listener;
1982	channel_pre[SSH_CHANNEL_AUTH_SOCKET] =		&channel_pre_listener;
1983	channel_pre[SSH_CHANNEL_INPUT_DRAINING] =	&channel_pre_input_draining;
1984	channel_pre[SSH_CHANNEL_OUTPUT_DRAINING] =	&channel_pre_output_draining;
1985	channel_pre[SSH_CHANNEL_CONNECTING] =		&channel_pre_connecting;
1986	channel_pre[SSH_CHANNEL_DYNAMIC] =		&channel_pre_dynamic;
1987
1988	channel_post[SSH_CHANNEL_OPEN] =		&channel_post_open;
1989	channel_post[SSH_CHANNEL_X11_LISTENER] =	&channel_post_x11_listener;
1990	channel_post[SSH_CHANNEL_PORT_LISTENER] =	&channel_post_port_listener;
1991	channel_post[SSH_CHANNEL_AUTH_SOCKET] =		&channel_post_auth_listener;
1992	channel_post[SSH_CHANNEL_OUTPUT_DRAINING] =	&channel_post_output_drain_13;
1993	channel_post[SSH_CHANNEL_CONNECTING] =		&channel_post_connecting;
1994	channel_post[SSH_CHANNEL_DYNAMIC] =		&channel_post_open;
1995}
1996
1997static void
1998channel_handler_init_15(void)
1999{
2000	channel_pre[SSH_CHANNEL_OPEN] =			&channel_pre_open;
2001	channel_pre[SSH_CHANNEL_X11_OPEN] =		&channel_pre_x11_open;
2002	channel_pre[SSH_CHANNEL_X11_LISTENER] =		&channel_pre_listener;
2003	channel_pre[SSH_CHANNEL_PORT_LISTENER] =	&channel_pre_listener;
2004	channel_pre[SSH_CHANNEL_AUTH_SOCKET] =		&channel_pre_listener;
2005	channel_pre[SSH_CHANNEL_CONNECTING] =		&channel_pre_connecting;
2006	channel_pre[SSH_CHANNEL_DYNAMIC] =		&channel_pre_dynamic;
2007
2008	channel_post[SSH_CHANNEL_X11_LISTENER] =	&channel_post_x11_listener;
2009	channel_post[SSH_CHANNEL_PORT_LISTENER] =	&channel_post_port_listener;
2010	channel_post[SSH_CHANNEL_AUTH_SOCKET] =		&channel_post_auth_listener;
2011	channel_post[SSH_CHANNEL_OPEN] =		&channel_post_open;
2012	channel_post[SSH_CHANNEL_CONNECTING] =		&channel_post_connecting;
2013	channel_post[SSH_CHANNEL_DYNAMIC] =		&channel_post_open;
2014}
2015
2016static void
2017channel_handler_init(void)
2018{
2019	int i;
2020
2021	for (i = 0; i < SSH_CHANNEL_MAX_TYPE; i++) {
2022		channel_pre[i] = NULL;
2023		channel_post[i] = NULL;
2024	}
2025	if (compat20)
2026		channel_handler_init_20();
2027	else if (compat13)
2028		channel_handler_init_13();
2029	else
2030		channel_handler_init_15();
2031}
2032
2033/* gc dead channels */
2034static void
2035channel_garbage_collect(Channel *c)
2036{
2037	if (c == NULL)
2038		return;
2039	if (c->detach_user != NULL) {
2040		if (!chan_is_dead(c, c->detach_close))
2041			return;
2042		debug2("channel %d: gc: notify user", c->self);
2043		c->detach_user(c->self, NULL);
2044		/* if we still have a callback */
2045		if (c->detach_user != NULL)
2046			return;
2047		debug2("channel %d: gc: user detached", c->self);
2048	}
2049	if (!chan_is_dead(c, 1))
2050		return;
2051	debug2("channel %d: garbage collecting", c->self);
2052	channel_free(c);
2053}
2054
2055static void
2056channel_handler(chan_fn *ftab[], fd_set *readset, fd_set *writeset)
2057{
2058	static int did_init = 0;
2059	u_int i, oalloc;
2060	Channel *c;
2061
2062	if (!did_init) {
2063		channel_handler_init();
2064		did_init = 1;
2065	}
2066	for (i = 0, oalloc = channels_alloc; i < oalloc; i++) {
2067		c = channels[i];
2068		if (c == NULL)
2069			continue;
2070		if (c->delayed) {
2071			if (ftab == channel_pre)
2072				c->delayed = 0;
2073			else
2074				continue;
2075		}
2076		if (ftab[c->type] != NULL)
2077			(*ftab[c->type])(c, readset, writeset);
2078		channel_garbage_collect(c);
2079	}
2080}
2081
2082/*
2083 * Allocate/update select bitmasks and add any bits relevant to channels in
2084 * select bitmasks.
2085 */
2086void
2087channel_prepare_select(fd_set **readsetp, fd_set **writesetp, int *maxfdp,
2088    u_int *nallocp, int rekeying)
2089{
2090	u_int n, sz, nfdset;
2091
2092	n = MAX(*maxfdp, channel_max_fd);
2093
2094	nfdset = howmany(n+1, NFDBITS);
2095	/* Explicitly test here, because xrealloc isn't always called */
2096	if (nfdset && SIZE_T_MAX / nfdset < sizeof(fd_mask))
2097		fatal("channel_prepare_select: max_fd (%d) is too large", n);
2098	sz = nfdset * sizeof(fd_mask);
2099
2100	/* perhaps check sz < nalloc/2 and shrink? */
2101	if (*readsetp == NULL || sz > *nallocp) {
2102		*readsetp = xrealloc(*readsetp, nfdset, sizeof(fd_mask));
2103		*writesetp = xrealloc(*writesetp, nfdset, sizeof(fd_mask));
2104		*nallocp = sz;
2105	}
2106	*maxfdp = n;
2107	memset(*readsetp, 0, sz);
2108	memset(*writesetp, 0, sz);
2109
2110	if (!rekeying)
2111		channel_handler(channel_pre, *readsetp, *writesetp);
2112}
2113
2114/*
2115 * After select, perform any appropriate operations for channels which have
2116 * events pending.
2117 */
2118void
2119channel_after_select(fd_set *readset, fd_set *writeset)
2120{
2121	channel_handler(channel_post, readset, writeset);
2122}
2123
2124
2125/* If there is data to send to the connection, enqueue some of it now. */
2126void
2127channel_output_poll(void)
2128{
2129	Channel *c;
2130	u_int i, len;
2131
2132	for (i = 0; i < channels_alloc; i++) {
2133		c = channels[i];
2134		if (c == NULL)
2135			continue;
2136
2137		/*
2138		 * We are only interested in channels that can have buffered
2139		 * incoming data.
2140		 */
2141		if (compat13) {
2142			if (c->type != SSH_CHANNEL_OPEN &&
2143			    c->type != SSH_CHANNEL_INPUT_DRAINING)
2144				continue;
2145		} else {
2146			if (c->type != SSH_CHANNEL_OPEN)
2147				continue;
2148		}
2149		if (compat20 &&
2150		    (c->flags & (CHAN_CLOSE_SENT|CHAN_CLOSE_RCVD))) {
2151			/* XXX is this true? */
2152			debug3("channel %d: will not send data after close", c->self);
2153			continue;
2154		}
2155
2156		/* Get the amount of buffered data for this channel. */
2157		if ((c->istate == CHAN_INPUT_OPEN ||
2158		    c->istate == CHAN_INPUT_WAIT_DRAIN) &&
2159		    (len = buffer_len(&c->input)) > 0) {
2160			if (c->datagram) {
2161				if (len > 0) {
2162					u_char *data;
2163					u_int dlen;
2164
2165					data = buffer_get_string(&c->input,
2166					    &dlen);
2167					packet_start(SSH2_MSG_CHANNEL_DATA);
2168					packet_put_int(c->remote_id);
2169					packet_put_string(data, dlen);
2170					packet_send();
2171					c->remote_window -= dlen + 4;
2172					xfree(data);
2173				}
2174				continue;
2175			}
2176			/*
2177			 * Send some data for the other side over the secure
2178			 * connection.
2179			 */
2180			if (compat20) {
2181				if (len > c->remote_window)
2182					len = c->remote_window;
2183				if (len > c->remote_maxpacket)
2184					len = c->remote_maxpacket;
2185			} else {
2186				if (packet_is_interactive()) {
2187					if (len > 1024)
2188						len = 512;
2189				} else {
2190					/* Keep the packets at reasonable size. */
2191					if (len > packet_get_maxsize()/2)
2192						len = packet_get_maxsize()/2;
2193				}
2194			}
2195			if (len > 0) {
2196				packet_start(compat20 ?
2197				    SSH2_MSG_CHANNEL_DATA : SSH_MSG_CHANNEL_DATA);
2198				packet_put_int(c->remote_id);
2199				packet_put_string(buffer_ptr(&c->input), len);
2200				packet_send();
2201				buffer_consume(&c->input, len);
2202				c->remote_window -= len;
2203			}
2204		} else if (c->istate == CHAN_INPUT_WAIT_DRAIN) {
2205			if (compat13)
2206				fatal("cannot happen: istate == INPUT_WAIT_DRAIN for proto 1.3");
2207			/*
2208			 * input-buffer is empty and read-socket shutdown:
2209			 * tell peer, that we will not send more data: send IEOF.
2210			 * hack for extended data: delay EOF if EFD still in use.
2211			 */
2212			if (CHANNEL_EFD_INPUT_ACTIVE(c))
2213				debug2("channel %d: ibuf_empty delayed efd %d/(%d)",
2214				    c->self, c->efd, buffer_len(&c->extended));
2215			else
2216				chan_ibuf_empty(c);
2217		}
2218		/* Send extended data, i.e. stderr */
2219		if (compat20 &&
2220		    !(c->flags & CHAN_EOF_SENT) &&
2221		    c->remote_window > 0 &&
2222		    (len = buffer_len(&c->extended)) > 0 &&
2223		    c->extended_usage == CHAN_EXTENDED_READ) {
2224			debug2("channel %d: rwin %u elen %u euse %d",
2225			    c->self, c->remote_window, buffer_len(&c->extended),
2226			    c->extended_usage);
2227			if (len > c->remote_window)
2228				len = c->remote_window;
2229			if (len > c->remote_maxpacket)
2230				len = c->remote_maxpacket;
2231			packet_start(SSH2_MSG_CHANNEL_EXTENDED_DATA);
2232			packet_put_int(c->remote_id);
2233			packet_put_int(SSH2_EXTENDED_DATA_STDERR);
2234			packet_put_string(buffer_ptr(&c->extended), len);
2235			packet_send();
2236			buffer_consume(&c->extended, len);
2237			c->remote_window -= len;
2238			debug2("channel %d: sent ext data %d", c->self, len);
2239		}
2240	}
2241}
2242
2243
2244/* -- protocol input */
2245
2246/* ARGSUSED */
2247void
2248channel_input_data(int type, u_int32_t seq, void *ctxt)
2249{
2250	int id;
2251	char *data;
2252	u_int data_len;
2253	Channel *c;
2254
2255	/* Get the channel number and verify it. */
2256	id = packet_get_int();
2257	c = channel_lookup(id);
2258	if (c == NULL)
2259		packet_disconnect("Received data for nonexistent channel %d.", id);
2260
2261	/* Ignore any data for non-open channels (might happen on close) */
2262	if (c->type != SSH_CHANNEL_OPEN &&
2263	    c->type != SSH_CHANNEL_X11_OPEN)
2264		return;
2265
2266	/* Get the data. */
2267	data = packet_get_string_ptr(&data_len);
2268
2269	/*
2270	 * Ignore data for protocol > 1.3 if output end is no longer open.
2271	 * For protocol 2 the sending side is reducing its window as it sends
2272	 * data, so we must 'fake' consumption of the data in order to ensure
2273	 * that window updates are sent back.  Otherwise the connection might
2274	 * deadlock.
2275	 */
2276	if (!compat13 && c->ostate != CHAN_OUTPUT_OPEN) {
2277		if (compat20) {
2278			c->local_window -= data_len;
2279			c->local_consumed += data_len;
2280		}
2281		return;
2282	}
2283
2284	if (compat20) {
2285		if (data_len > c->local_maxpacket) {
2286			logit("channel %d: rcvd big packet %d, maxpack %d",
2287			    c->self, data_len, c->local_maxpacket);
2288		}
2289		if (data_len > c->local_window) {
2290			logit("channel %d: rcvd too much data %d, win %d",
2291			    c->self, data_len, c->local_window);
2292			return;
2293		}
2294		c->local_window -= data_len;
2295	}
2296	if (c->datagram)
2297		buffer_put_string(&c->output, data, data_len);
2298	else
2299		buffer_append(&c->output, data, data_len);
2300	packet_check_eom();
2301}
2302
2303/* ARGSUSED */
2304void
2305channel_input_extended_data(int type, u_int32_t seq, void *ctxt)
2306{
2307	int id;
2308	char *data;
2309	u_int data_len, tcode;
2310	Channel *c;
2311
2312	/* Get the channel number and verify it. */
2313	id = packet_get_int();
2314	c = channel_lookup(id);
2315
2316	if (c == NULL)
2317		packet_disconnect("Received extended_data for bad channel %d.", id);
2318	if (c->type != SSH_CHANNEL_OPEN) {
2319		logit("channel %d: ext data for non open", id);
2320		return;
2321	}
2322	if (c->flags & CHAN_EOF_RCVD) {
2323		if (datafellows & SSH_BUG_EXTEOF)
2324			debug("channel %d: accepting ext data after eof", id);
2325		else
2326			packet_disconnect("Received extended_data after EOF "
2327			    "on channel %d.", id);
2328	}
2329	tcode = packet_get_int();
2330	if (c->efd == -1 ||
2331	    c->extended_usage != CHAN_EXTENDED_WRITE ||
2332	    tcode != SSH2_EXTENDED_DATA_STDERR) {
2333		logit("channel %d: bad ext data", c->self);
2334		return;
2335	}
2336	data = packet_get_string(&data_len);
2337	packet_check_eom();
2338	if (data_len > c->local_window) {
2339		logit("channel %d: rcvd too much extended_data %d, win %d",
2340		    c->self, data_len, c->local_window);
2341		xfree(data);
2342		return;
2343	}
2344	debug2("channel %d: rcvd ext data %d", c->self, data_len);
2345	c->local_window -= data_len;
2346	buffer_append(&c->extended, data, data_len);
2347	xfree(data);
2348}
2349
2350/* ARGSUSED */
2351void
2352channel_input_ieof(int type, u_int32_t seq, void *ctxt)
2353{
2354	int id;
2355	Channel *c;
2356
2357	id = packet_get_int();
2358	packet_check_eom();
2359	c = channel_lookup(id);
2360	if (c == NULL)
2361		packet_disconnect("Received ieof for nonexistent channel %d.", id);
2362	chan_rcvd_ieof(c);
2363
2364	/* XXX force input close */
2365	if (c->force_drain && c->istate == CHAN_INPUT_OPEN) {
2366		debug("channel %d: FORCE input drain", c->self);
2367		c->istate = CHAN_INPUT_WAIT_DRAIN;
2368		if (buffer_len(&c->input) == 0)
2369			chan_ibuf_empty(c);
2370	}
2371
2372}
2373
2374/* ARGSUSED */
2375void
2376channel_input_close(int type, u_int32_t seq, void *ctxt)
2377{
2378	int id;
2379	Channel *c;
2380
2381	id = packet_get_int();
2382	packet_check_eom();
2383	c = channel_lookup(id);
2384	if (c == NULL)
2385		packet_disconnect("Received close for nonexistent channel %d.", id);
2386
2387	/*
2388	 * Send a confirmation that we have closed the channel and no more
2389	 * data is coming for it.
2390	 */
2391	packet_start(SSH_MSG_CHANNEL_CLOSE_CONFIRMATION);
2392	packet_put_int(c->remote_id);
2393	packet_send();
2394
2395	/*
2396	 * If the channel is in closed state, we have sent a close request,
2397	 * and the other side will eventually respond with a confirmation.
2398	 * Thus, we cannot free the channel here, because then there would be
2399	 * no-one to receive the confirmation.  The channel gets freed when
2400	 * the confirmation arrives.
2401	 */
2402	if (c->type != SSH_CHANNEL_CLOSED) {
2403		/*
2404		 * Not a closed channel - mark it as draining, which will
2405		 * cause it to be freed later.
2406		 */
2407		buffer_clear(&c->input);
2408		c->type = SSH_CHANNEL_OUTPUT_DRAINING;
2409	}
2410}
2411
2412/* proto version 1.5 overloads CLOSE_CONFIRMATION with OCLOSE */
2413/* ARGSUSED */
2414void
2415channel_input_oclose(int type, u_int32_t seq, void *ctxt)
2416{
2417	int id = packet_get_int();
2418	Channel *c = channel_lookup(id);
2419
2420	packet_check_eom();
2421	if (c == NULL)
2422		packet_disconnect("Received oclose for nonexistent channel %d.", id);
2423	chan_rcvd_oclose(c);
2424}
2425
2426/* ARGSUSED */
2427void
2428channel_input_close_confirmation(int type, u_int32_t seq, void *ctxt)
2429{
2430	int id = packet_get_int();
2431	Channel *c = channel_lookup(id);
2432
2433	packet_check_eom();
2434	if (c == NULL)
2435		packet_disconnect("Received close confirmation for "
2436		    "out-of-range channel %d.", id);
2437	if (c->type != SSH_CHANNEL_CLOSED)
2438		packet_disconnect("Received close confirmation for "
2439		    "non-closed channel %d (type %d).", id, c->type);
2440	channel_free(c);
2441}
2442
2443/* ARGSUSED */
2444void
2445channel_input_open_confirmation(int type, u_int32_t seq, void *ctxt)
2446{
2447	int id, remote_id;
2448	Channel *c;
2449
2450	id = packet_get_int();
2451	c = channel_lookup(id);
2452
2453	if (c==NULL || c->type != SSH_CHANNEL_OPENING)
2454		packet_disconnect("Received open confirmation for "
2455		    "non-opening channel %d.", id);
2456	remote_id = packet_get_int();
2457	/* Record the remote channel number and mark that the channel is now open. */
2458	c->remote_id = remote_id;
2459	c->type = SSH_CHANNEL_OPEN;
2460
2461	if (compat20) {
2462		c->remote_window = packet_get_int();
2463		c->remote_maxpacket = packet_get_int();
2464		if (c->open_confirm) {
2465			debug2("callback start");
2466			c->open_confirm(c->self, c->open_confirm_ctx);
2467			debug2("callback done");
2468		}
2469		debug2("channel %d: open confirm rwindow %u rmax %u", c->self,
2470		    c->remote_window, c->remote_maxpacket);
2471	}
2472	packet_check_eom();
2473}
2474
2475static char *
2476reason2txt(int reason)
2477{
2478	switch (reason) {
2479	case SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED:
2480		return "administratively prohibited";
2481	case SSH2_OPEN_CONNECT_FAILED:
2482		return "connect failed";
2483	case SSH2_OPEN_UNKNOWN_CHANNEL_TYPE:
2484		return "unknown channel type";
2485	case SSH2_OPEN_RESOURCE_SHORTAGE:
2486		return "resource shortage";
2487	}
2488	return "unknown reason";
2489}
2490
2491/* ARGSUSED */
2492void
2493channel_input_open_failure(int type, u_int32_t seq, void *ctxt)
2494{
2495	int id, reason;
2496	char *msg = NULL, *lang = NULL;
2497	Channel *c;
2498
2499	id = packet_get_int();
2500	c = channel_lookup(id);
2501
2502	if (c==NULL || c->type != SSH_CHANNEL_OPENING)
2503		packet_disconnect("Received open failure for "
2504		    "non-opening channel %d.", id);
2505	if (compat20) {
2506		reason = packet_get_int();
2507		if (!(datafellows & SSH_BUG_OPENFAILURE)) {
2508			msg  = packet_get_string(NULL);
2509			lang = packet_get_string(NULL);
2510		}
2511		logit("channel %d: open failed: %s%s%s", id,
2512		    reason2txt(reason), msg ? ": ": "", msg ? msg : "");
2513		if (msg != NULL)
2514			xfree(msg);
2515		if (lang != NULL)
2516			xfree(lang);
2517	}
2518	packet_check_eom();
2519	/* Schedule the channel for cleanup/deletion. */
2520	chan_mark_dead(c);
2521}
2522
2523/* ARGSUSED */
2524void
2525channel_input_window_adjust(int type, u_int32_t seq, void *ctxt)
2526{
2527	Channel *c;
2528	int id;
2529	u_int adjust;
2530
2531	if (!compat20)
2532		return;
2533
2534	/* Get the channel number and verify it. */
2535	id = packet_get_int();
2536	c = channel_lookup(id);
2537
2538	if (c == NULL) {
2539		logit("Received window adjust for non-open channel %d.", id);
2540		return;
2541	}
2542	adjust = packet_get_int();
2543	packet_check_eom();
2544	debug2("channel %d: rcvd adjust %u", id, adjust);
2545	c->remote_window += adjust;
2546}
2547
2548/* ARGSUSED */
2549void
2550channel_input_port_open(int type, u_int32_t seq, void *ctxt)
2551{
2552	Channel *c = NULL;
2553	u_short host_port;
2554	char *host, *originator_string;
2555	int remote_id;
2556
2557	remote_id = packet_get_int();
2558	host = packet_get_string(NULL);
2559	host_port = packet_get_int();
2560
2561	if (packet_get_protocol_flags() & SSH_PROTOFLAG_HOST_IN_FWD_OPEN) {
2562		originator_string = packet_get_string(NULL);
2563	} else {
2564		originator_string = xstrdup("unknown (remote did not supply name)");
2565	}
2566	packet_check_eom();
2567	c = channel_connect_to(host, host_port,
2568	    "connected socket", originator_string);
2569	xfree(originator_string);
2570	xfree(host);
2571	if (c == NULL) {
2572		packet_start(SSH_MSG_CHANNEL_OPEN_FAILURE);
2573		packet_put_int(remote_id);
2574		packet_send();
2575	} else
2576		c->remote_id = remote_id;
2577}
2578
2579/* ARGSUSED */
2580void
2581channel_input_status_confirm(int type, u_int32_t seq, void *ctxt)
2582{
2583	Channel *c;
2584	struct channel_confirm *cc;
2585	int id;
2586
2587	/* Reset keepalive timeout */
2588	packet_set_alive_timeouts(0);
2589
2590	id = packet_get_int();
2591	packet_check_eom();
2592
2593	debug2("channel_input_status_confirm: type %d id %d", type, id);
2594
2595	if ((c = channel_lookup(id)) == NULL) {
2596		logit("channel_input_status_confirm: %d: unknown", id);
2597		return;
2598	}
2599	;
2600	if ((cc = TAILQ_FIRST(&c->status_confirms)) == NULL)
2601		return;
2602	cc->cb(type, c, cc->ctx);
2603	TAILQ_REMOVE(&c->status_confirms, cc, entry);
2604	bzero(cc, sizeof(*cc));
2605	xfree(cc);
2606}
2607
2608/* -- tcp forwarding */
2609
2610void
2611channel_set_af(int af)
2612{
2613	IPv4or6 = af;
2614}
2615
2616static int
2617channel_setup_fwd_listener(int type, const char *listen_addr,
2618    u_short listen_port, int *allocated_listen_port,
2619    const char *host_to_connect, u_short port_to_connect, int gateway_ports)
2620{
2621	Channel *c;
2622	int sock, r, success = 0, wildcard = 0, is_client;
2623	struct addrinfo hints, *ai, *aitop;
2624	const char *host, *addr;
2625	char ntop[NI_MAXHOST], strport[NI_MAXSERV];
2626	in_port_t *lport_p;
2627
2628	host = (type == SSH_CHANNEL_RPORT_LISTENER) ?
2629	    listen_addr : host_to_connect;
2630	is_client = (type == SSH_CHANNEL_PORT_LISTENER);
2631
2632	if (host == NULL) {
2633		error("No forward host name.");
2634		return 0;
2635	}
2636	if (strlen(host) >= NI_MAXHOST) {
2637		error("Forward host name too long.");
2638		return 0;
2639	}
2640
2641	/*
2642	 * Determine whether or not a port forward listens to loopback,
2643	 * specified address or wildcard. On the client, a specified bind
2644	 * address will always override gateway_ports. On the server, a
2645	 * gateway_ports of 1 (``yes'') will override the client's
2646	 * specification and force a wildcard bind, whereas a value of 2
2647	 * (``clientspecified'') will bind to whatever address the client
2648	 * asked for.
2649	 *
2650	 * Special-case listen_addrs are:
2651	 *
2652	 * "0.0.0.0"               -> wildcard v4/v6 if SSH_OLD_FORWARD_ADDR
2653	 * "" (empty string), "*"  -> wildcard v4/v6
2654	 * "localhost"             -> loopback v4/v6
2655	 */
2656	addr = NULL;
2657	if (listen_addr == NULL) {
2658		/* No address specified: default to gateway_ports setting */
2659		if (gateway_ports)
2660			wildcard = 1;
2661	} else if (gateway_ports || is_client) {
2662		if (((datafellows & SSH_OLD_FORWARD_ADDR) &&
2663		    strcmp(listen_addr, "0.0.0.0") == 0 && is_client == 0) ||
2664		    *listen_addr == '\0' || strcmp(listen_addr, "*") == 0 ||
2665		    (!is_client && gateway_ports == 1))
2666			wildcard = 1;
2667		else if (strcmp(listen_addr, "localhost") != 0)
2668			addr = listen_addr;
2669	}
2670
2671	debug3("channel_setup_fwd_listener: type %d wildcard %d addr %s",
2672	    type, wildcard, (addr == NULL) ? "NULL" : addr);
2673
2674	/*
2675	 * getaddrinfo returns a loopback address if the hostname is
2676	 * set to NULL and hints.ai_flags is not AI_PASSIVE
2677	 */
2678	memset(&hints, 0, sizeof(hints));
2679	hints.ai_family = IPv4or6;
2680	hints.ai_flags = wildcard ? AI_PASSIVE : 0;
2681	hints.ai_socktype = SOCK_STREAM;
2682	snprintf(strport, sizeof strport, "%d", listen_port);
2683	if ((r = getaddrinfo(addr, strport, &hints, &aitop)) != 0) {
2684		if (addr == NULL) {
2685			/* This really shouldn't happen */
2686			packet_disconnect("getaddrinfo: fatal error: %s",
2687			    ssh_gai_strerror(r));
2688		} else {
2689			error("channel_setup_fwd_listener: "
2690			    "getaddrinfo(%.64s): %s", addr,
2691			    ssh_gai_strerror(r));
2692		}
2693		return 0;
2694	}
2695	if (allocated_listen_port != NULL)
2696		*allocated_listen_port = 0;
2697	for (ai = aitop; ai; ai = ai->ai_next) {
2698		switch (ai->ai_family) {
2699		case AF_INET:
2700			lport_p = &((struct sockaddr_in *)ai->ai_addr)->
2701			    sin_port;
2702			break;
2703		case AF_INET6:
2704			lport_p = &((struct sockaddr_in6 *)ai->ai_addr)->
2705			    sin6_port;
2706			break;
2707		default:
2708			continue;
2709		}
2710		/*
2711		 * If allocating a port for -R forwards, then use the
2712		 * same port for all address families.
2713		 */
2714		if (type == SSH_CHANNEL_RPORT_LISTENER && listen_port == 0 &&
2715		    allocated_listen_port != NULL && *allocated_listen_port > 0)
2716			*lport_p = htons(*allocated_listen_port);
2717
2718		if (getnameinfo(ai->ai_addr, ai->ai_addrlen, ntop, sizeof(ntop),
2719		    strport, sizeof(strport), NI_NUMERICHOST|NI_NUMERICSERV) != 0) {
2720			error("channel_setup_fwd_listener: getnameinfo failed");
2721			continue;
2722		}
2723		/* Create a port to listen for the host. */
2724		sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
2725		if (sock < 0) {
2726			/* this is no error since kernel may not support ipv6 */
2727			verbose("socket: %.100s", strerror(errno));
2728			continue;
2729		}
2730
2731		channel_set_reuseaddr(sock);
2732		if (ai->ai_family == AF_INET6)
2733			sock_set_v6only(sock);
2734
2735		debug("Local forwarding listening on %s port %s.",
2736		    ntop, strport);
2737
2738		/* Bind the socket to the address. */
2739		if (bind(sock, ai->ai_addr, ai->ai_addrlen) < 0) {
2740			/* address can be in use ipv6 address is already bound */
2741			if (!ai->ai_next)
2742				error("bind: %.100s", strerror(errno));
2743			else
2744				verbose("bind: %.100s", strerror(errno));
2745
2746			close(sock);
2747			continue;
2748		}
2749		/* Start listening for connections on the socket. */
2750		if (listen(sock, SSH_LISTEN_BACKLOG) < 0) {
2751			error("listen: %.100s", strerror(errno));
2752			close(sock);
2753			continue;
2754		}
2755
2756		/*
2757		 * listen_port == 0 requests a dynamically allocated port -
2758		 * record what we got.
2759		 */
2760		if (type == SSH_CHANNEL_RPORT_LISTENER && listen_port == 0 &&
2761		    allocated_listen_port != NULL &&
2762		    *allocated_listen_port == 0) {
2763			*allocated_listen_port = get_sock_port(sock, 1);
2764			debug("Allocated listen port %d",
2765			    *allocated_listen_port);
2766		}
2767
2768		/* Allocate a channel number for the socket. */
2769		c = channel_new("port listener", type, sock, sock, -1,
2770		    CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT,
2771		    0, "port listener", 1);
2772		c->path = xstrdup(host);
2773		c->host_port = port_to_connect;
2774		c->listening_port = listen_port;
2775		success = 1;
2776	}
2777	if (success == 0)
2778		error("channel_setup_fwd_listener: cannot listen to port: %d",
2779		    listen_port);
2780	freeaddrinfo(aitop);
2781	return success;
2782}
2783
2784int
2785channel_cancel_rport_listener(const char *host, u_short port)
2786{
2787	u_int i;
2788	int found = 0;
2789
2790	for (i = 0; i < channels_alloc; i++) {
2791		Channel *c = channels[i];
2792
2793		if (c != NULL && c->type == SSH_CHANNEL_RPORT_LISTENER &&
2794		    strcmp(c->path, host) == 0 && c->listening_port == port) {
2795			debug2("%s: close channel %d", __func__, i);
2796			channel_free(c);
2797			found = 1;
2798		}
2799	}
2800
2801	return (found);
2802}
2803
2804/* protocol local port fwd, used by ssh (and sshd in v1) */
2805int
2806channel_setup_local_fwd_listener(const char *listen_host, u_short listen_port,
2807    const char *host_to_connect, u_short port_to_connect, int gateway_ports)
2808{
2809	return channel_setup_fwd_listener(SSH_CHANNEL_PORT_LISTENER,
2810	    listen_host, listen_port, NULL, host_to_connect, port_to_connect,
2811	    gateway_ports);
2812}
2813
2814/* protocol v2 remote port fwd, used by sshd */
2815int
2816channel_setup_remote_fwd_listener(const char *listen_address,
2817    u_short listen_port, int *allocated_listen_port, int gateway_ports)
2818{
2819	return channel_setup_fwd_listener(SSH_CHANNEL_RPORT_LISTENER,
2820	    listen_address, listen_port, allocated_listen_port,
2821	    NULL, 0, gateway_ports);
2822}
2823
2824/*
2825 * Initiate forwarding of connections to port "port" on remote host through
2826 * the secure channel to host:port from local side.
2827 */
2828
2829int
2830channel_request_remote_forwarding(const char *listen_host, u_short listen_port,
2831    const char *host_to_connect, u_short port_to_connect)
2832{
2833	int type, success = 0;
2834
2835	/* Record locally that connection to this host/port is permitted. */
2836	if (num_permitted_opens >= SSH_MAX_FORWARDS_PER_DIRECTION)
2837		fatal("channel_request_remote_forwarding: too many forwards");
2838
2839	/* Send the forward request to the remote side. */
2840	if (compat20) {
2841		const char *address_to_bind;
2842		if (listen_host == NULL) {
2843			if (datafellows & SSH_BUG_RFWD_ADDR)
2844				address_to_bind = "127.0.0.1";
2845			else
2846				address_to_bind = "localhost";
2847		} else if (*listen_host == '\0' ||
2848			   strcmp(listen_host, "*") == 0) {
2849			if (datafellows & SSH_BUG_RFWD_ADDR)
2850				address_to_bind = "0.0.0.0";
2851			else
2852				address_to_bind = "";
2853		} else
2854			address_to_bind = listen_host;
2855
2856		packet_start(SSH2_MSG_GLOBAL_REQUEST);
2857		packet_put_cstring("tcpip-forward");
2858		packet_put_char(1);			/* boolean: want reply */
2859		packet_put_cstring(address_to_bind);
2860		packet_put_int(listen_port);
2861		packet_send();
2862		packet_write_wait();
2863		/* Assume that server accepts the request */
2864		success = 1;
2865	} else {
2866		packet_start(SSH_CMSG_PORT_FORWARD_REQUEST);
2867		packet_put_int(listen_port);
2868		packet_put_cstring(host_to_connect);
2869		packet_put_int(port_to_connect);
2870		packet_send();
2871		packet_write_wait();
2872
2873		/* Wait for response from the remote side. */
2874		type = packet_read();
2875		switch (type) {
2876		case SSH_SMSG_SUCCESS:
2877			success = 1;
2878			break;
2879		case SSH_SMSG_FAILURE:
2880			break;
2881		default:
2882			/* Unknown packet */
2883			packet_disconnect("Protocol error for port forward request:"
2884			    "received packet type %d.", type);
2885		}
2886	}
2887	if (success) {
2888		permitted_opens[num_permitted_opens].host_to_connect = xstrdup(host_to_connect);
2889		permitted_opens[num_permitted_opens].port_to_connect = port_to_connect;
2890		permitted_opens[num_permitted_opens].listen_port = listen_port;
2891		num_permitted_opens++;
2892	}
2893	return (success ? 0 : -1);
2894}
2895
2896/*
2897 * Request cancellation of remote forwarding of connection host:port from
2898 * local side.
2899 */
2900void
2901channel_request_rforward_cancel(const char *host, u_short port)
2902{
2903	int i;
2904
2905	if (!compat20)
2906		return;
2907
2908	for (i = 0; i < num_permitted_opens; i++) {
2909		if (permitted_opens[i].host_to_connect != NULL &&
2910		    permitted_opens[i].listen_port == port)
2911			break;
2912	}
2913	if (i >= num_permitted_opens) {
2914		debug("%s: requested forward not found", __func__);
2915		return;
2916	}
2917	packet_start(SSH2_MSG_GLOBAL_REQUEST);
2918	packet_put_cstring("cancel-tcpip-forward");
2919	packet_put_char(0);
2920	packet_put_cstring(host == NULL ? "" : host);
2921	packet_put_int(port);
2922	packet_send();
2923
2924	permitted_opens[i].listen_port = 0;
2925	permitted_opens[i].port_to_connect = 0;
2926	xfree(permitted_opens[i].host_to_connect);
2927	permitted_opens[i].host_to_connect = NULL;
2928}
2929
2930/*
2931 * This is called after receiving CHANNEL_FORWARDING_REQUEST.  This initates
2932 * listening for the port, and sends back a success reply (or disconnect
2933 * message if there was an error).
2934 */
2935int
2936channel_input_port_forward_request(int is_root, int gateway_ports)
2937{
2938	u_short port, host_port;
2939	int success = 0;
2940	char *hostname;
2941
2942	/* Get arguments from the packet. */
2943	port = packet_get_int();
2944	hostname = packet_get_string(NULL);
2945	host_port = packet_get_int();
2946
2947#ifndef HAVE_CYGWIN
2948	/*
2949	 * Check that an unprivileged user is not trying to forward a
2950	 * privileged port.
2951	 */
2952	if (port < IPPORT_RESERVED && !is_root)
2953		packet_disconnect(
2954		    "Requested forwarding of port %d but user is not root.",
2955		    port);
2956	if (host_port == 0)
2957		packet_disconnect("Dynamic forwarding denied.");
2958#endif
2959
2960	/* Initiate forwarding */
2961	success = channel_setup_local_fwd_listener(NULL, port, hostname,
2962	    host_port, gateway_ports);
2963
2964	/* Free the argument string. */
2965	xfree(hostname);
2966
2967	return (success ? 0 : -1);
2968}
2969
2970/*
2971 * Permits opening to any host/port if permitted_opens[] is empty.  This is
2972 * usually called by the server, because the user could connect to any port
2973 * anyway, and the server has no way to know but to trust the client anyway.
2974 */
2975void
2976channel_permit_all_opens(void)
2977{
2978	if (num_permitted_opens == 0)
2979		all_opens_permitted = 1;
2980}
2981
2982void
2983channel_add_permitted_opens(char *host, int port)
2984{
2985	if (num_permitted_opens >= SSH_MAX_FORWARDS_PER_DIRECTION)
2986		fatal("channel_add_permitted_opens: too many forwards");
2987	debug("allow port forwarding to host %s port %d", host, port);
2988
2989	permitted_opens[num_permitted_opens].host_to_connect = xstrdup(host);
2990	permitted_opens[num_permitted_opens].port_to_connect = port;
2991	num_permitted_opens++;
2992
2993	all_opens_permitted = 0;
2994}
2995
2996int
2997channel_add_adm_permitted_opens(char *host, int port)
2998{
2999	if (num_adm_permitted_opens >= SSH_MAX_FORWARDS_PER_DIRECTION)
3000		fatal("channel_add_adm_permitted_opens: too many forwards");
3001	debug("config allows port forwarding to host %s port %d", host, port);
3002
3003	permitted_adm_opens[num_adm_permitted_opens].host_to_connect
3004	     = xstrdup(host);
3005	permitted_adm_opens[num_adm_permitted_opens].port_to_connect = port;
3006	return ++num_adm_permitted_opens;
3007}
3008
3009void
3010channel_clear_permitted_opens(void)
3011{
3012	int i;
3013
3014	for (i = 0; i < num_permitted_opens; i++)
3015		if (permitted_opens[i].host_to_connect != NULL)
3016			xfree(permitted_opens[i].host_to_connect);
3017	num_permitted_opens = 0;
3018}
3019
3020void
3021channel_clear_adm_permitted_opens(void)
3022{
3023	int i;
3024
3025	for (i = 0; i < num_adm_permitted_opens; i++)
3026		if (permitted_adm_opens[i].host_to_connect != NULL)
3027			xfree(permitted_adm_opens[i].host_to_connect);
3028	num_adm_permitted_opens = 0;
3029}
3030
3031void
3032channel_print_adm_permitted_opens(void)
3033{
3034	int i;
3035
3036	printf("permitopen");
3037	if (num_adm_permitted_opens == 0) {
3038		printf(" any\n");
3039		return;
3040	}
3041	for (i = 0; i < num_adm_permitted_opens; i++)
3042		if (permitted_adm_opens[i].host_to_connect != NULL)
3043			printf(" %s:%d", permitted_adm_opens[i].host_to_connect,
3044			    permitted_adm_opens[i].port_to_connect);
3045	printf("\n");
3046}
3047
3048/* Try to start non-blocking connect to next host in cctx list */
3049static int
3050connect_next(struct channel_connect *cctx)
3051{
3052	int sock, saved_errno;
3053	char ntop[NI_MAXHOST], strport[NI_MAXSERV];
3054
3055	for (; cctx->ai; cctx->ai = cctx->ai->ai_next) {
3056		if (cctx->ai->ai_family != AF_INET &&
3057		    cctx->ai->ai_family != AF_INET6)
3058			continue;
3059		if (getnameinfo(cctx->ai->ai_addr, cctx->ai->ai_addrlen,
3060		    ntop, sizeof(ntop), strport, sizeof(strport),
3061		    NI_NUMERICHOST|NI_NUMERICSERV) != 0) {
3062			error("connect_next: getnameinfo failed");
3063			continue;
3064		}
3065		if ((sock = socket(cctx->ai->ai_family, cctx->ai->ai_socktype,
3066		    cctx->ai->ai_protocol)) == -1) {
3067			if (cctx->ai->ai_next == NULL)
3068				error("socket: %.100s", strerror(errno));
3069			else
3070				verbose("socket: %.100s", strerror(errno));
3071			continue;
3072		}
3073		if (set_nonblock(sock) == -1)
3074			fatal("%s: set_nonblock(%d)", __func__, sock);
3075		if (connect(sock, cctx->ai->ai_addr,
3076		    cctx->ai->ai_addrlen) == -1 && errno != EINPROGRESS) {
3077			debug("connect_next: host %.100s ([%.100s]:%s): "
3078			    "%.100s", cctx->host, ntop, strport,
3079			    strerror(errno));
3080			saved_errno = errno;
3081			close(sock);
3082			errno = saved_errno;
3083			continue;	/* fail -- try next */
3084		}
3085		debug("connect_next: host %.100s ([%.100s]:%s) "
3086		    "in progress, fd=%d", cctx->host, ntop, strport, sock);
3087		cctx->ai = cctx->ai->ai_next;
3088		set_nodelay(sock);
3089		return sock;
3090	}
3091	return -1;
3092}
3093
3094static void
3095channel_connect_ctx_free(struct channel_connect *cctx)
3096{
3097	xfree(cctx->host);
3098	if (cctx->aitop)
3099		freeaddrinfo(cctx->aitop);
3100	bzero(cctx, sizeof(*cctx));
3101	cctx->host = NULL;
3102	cctx->ai = cctx->aitop = NULL;
3103}
3104
3105/* Return CONNECTING channel to remote host, port */
3106static Channel *
3107connect_to(const char *host, u_short port, char *ctype, char *rname)
3108{
3109	struct addrinfo hints;
3110	int gaierr;
3111	int sock = -1;
3112	char strport[NI_MAXSERV];
3113	struct channel_connect cctx;
3114	Channel *c;
3115
3116	memset(&cctx, 0, sizeof(cctx));
3117	memset(&hints, 0, sizeof(hints));
3118	hints.ai_family = IPv4or6;
3119	hints.ai_socktype = SOCK_STREAM;
3120	snprintf(strport, sizeof strport, "%d", port);
3121	if ((gaierr = getaddrinfo(host, strport, &hints, &cctx.aitop)) != 0) {
3122		error("connect_to %.100s: unknown host (%s)", host,
3123		    ssh_gai_strerror(gaierr));
3124		return NULL;
3125	}
3126
3127	cctx.host = xstrdup(host);
3128	cctx.port = port;
3129	cctx.ai = cctx.aitop;
3130
3131	if ((sock = connect_next(&cctx)) == -1) {
3132		error("connect to %.100s port %d failed: %s",
3133		    host, port, strerror(errno));
3134		channel_connect_ctx_free(&cctx);
3135		return NULL;
3136	}
3137	c = channel_new(ctype, SSH_CHANNEL_CONNECTING, sock, sock, -1,
3138	    CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT, 0, rname, 1);
3139	c->connect_ctx = cctx;
3140	return c;
3141}
3142
3143Channel *
3144channel_connect_by_listen_address(u_short listen_port, char *ctype, char *rname)
3145{
3146	int i;
3147
3148	for (i = 0; i < num_permitted_opens; i++) {
3149		if (permitted_opens[i].host_to_connect != NULL &&
3150		    permitted_opens[i].listen_port == listen_port) {
3151			return connect_to(
3152			    permitted_opens[i].host_to_connect,
3153			    permitted_opens[i].port_to_connect, ctype, rname);
3154		}
3155	}
3156	error("WARNING: Server requests forwarding for unknown listen_port %d",
3157	    listen_port);
3158	return NULL;
3159}
3160
3161/* Check if connecting to that port is permitted and connect. */
3162Channel *
3163channel_connect_to(const char *host, u_short port, char *ctype, char *rname)
3164{
3165	int i, permit, permit_adm = 1;
3166
3167	permit = all_opens_permitted;
3168	if (!permit) {
3169		for (i = 0; i < num_permitted_opens; i++)
3170			if (permitted_opens[i].host_to_connect != NULL &&
3171			    permitted_opens[i].port_to_connect == port &&
3172			    strcmp(permitted_opens[i].host_to_connect, host) == 0)
3173				permit = 1;
3174	}
3175
3176	if (num_adm_permitted_opens > 0) {
3177		permit_adm = 0;
3178		for (i = 0; i < num_adm_permitted_opens; i++)
3179			if (permitted_adm_opens[i].host_to_connect != NULL &&
3180			    permitted_adm_opens[i].port_to_connect == port &&
3181			    strcmp(permitted_adm_opens[i].host_to_connect, host)
3182			    == 0)
3183				permit_adm = 1;
3184	}
3185
3186	if (!permit || !permit_adm) {
3187		logit("Received request to connect to host %.100s port %d, "
3188		    "but the request was denied.", host, port);
3189		return NULL;
3190	}
3191	return connect_to(host, port, ctype, rname);
3192}
3193
3194void
3195channel_send_window_changes(void)
3196{
3197	u_int i;
3198	struct winsize ws;
3199
3200	for (i = 0; i < channels_alloc; i++) {
3201		if (channels[i] == NULL || !channels[i]->client_tty ||
3202		    channels[i]->type != SSH_CHANNEL_OPEN)
3203			continue;
3204		if (ioctl(channels[i]->rfd, TIOCGWINSZ, &ws) < 0)
3205			continue;
3206		channel_request_start(i, "window-change", 0);
3207		packet_put_int((u_int)ws.ws_col);
3208		packet_put_int((u_int)ws.ws_row);
3209		packet_put_int((u_int)ws.ws_xpixel);
3210		packet_put_int((u_int)ws.ws_ypixel);
3211		packet_send();
3212	}
3213}
3214
3215/* -- X11 forwarding */
3216
3217/*
3218 * Creates an internet domain socket for listening for X11 connections.
3219 * Returns 0 and a suitable display number for the DISPLAY variable
3220 * stored in display_numberp , or -1 if an error occurs.
3221 */
3222int
3223x11_create_display_inet(int x11_display_offset, int x11_use_localhost,
3224    int single_connection, u_int *display_numberp, int **chanids)
3225{
3226	Channel *nc = NULL;
3227	int display_number, sock;
3228	u_short port;
3229	struct addrinfo hints, *ai, *aitop;
3230	char strport[NI_MAXSERV];
3231	int gaierr, n, num_socks = 0, socks[NUM_SOCKS];
3232
3233	if (chanids == NULL)
3234		return -1;
3235
3236	for (display_number = x11_display_offset;
3237	    display_number < MAX_DISPLAYS;
3238	    display_number++) {
3239		port = 6000 + display_number;
3240		memset(&hints, 0, sizeof(hints));
3241		hints.ai_family = IPv4or6;
3242		hints.ai_flags = x11_use_localhost ? 0: AI_PASSIVE;
3243		hints.ai_socktype = SOCK_STREAM;
3244		snprintf(strport, sizeof strport, "%d", port);
3245		if ((gaierr = getaddrinfo(NULL, strport, &hints, &aitop)) != 0) {
3246			error("getaddrinfo: %.100s", ssh_gai_strerror(gaierr));
3247			return -1;
3248		}
3249		for (ai = aitop; ai; ai = ai->ai_next) {
3250			if (ai->ai_family != AF_INET && ai->ai_family != AF_INET6)
3251				continue;
3252			sock = socket(ai->ai_family, ai->ai_socktype,
3253			    ai->ai_protocol);
3254			if (sock < 0) {
3255				if ((errno != EINVAL) && (errno != EAFNOSUPPORT)) {
3256					error("socket: %.100s", strerror(errno));
3257					freeaddrinfo(aitop);
3258					return -1;
3259				} else {
3260					debug("x11_create_display_inet: Socket family %d not supported",
3261						 ai->ai_family);
3262					continue;
3263				}
3264			}
3265			if (ai->ai_family == AF_INET6)
3266				sock_set_v6only(sock);
3267			if (x11_use_localhost)
3268				channel_set_reuseaddr(sock);
3269			if (bind(sock, ai->ai_addr, ai->ai_addrlen) < 0) {
3270				debug2("bind port %d: %.100s", port, strerror(errno));
3271				close(sock);
3272
3273				for (n = 0; n < num_socks; n++) {
3274					close(socks[n]);
3275				}
3276				num_socks = 0;
3277				break;
3278			}
3279			socks[num_socks++] = sock;
3280			if (num_socks == NUM_SOCKS)
3281				break;
3282		}
3283		freeaddrinfo(aitop);
3284		if (num_socks > 0)
3285			break;
3286	}
3287	if (display_number >= MAX_DISPLAYS) {
3288		error("Failed to allocate internet-domain X11 display socket.");
3289		return -1;
3290	}
3291	/* Start listening for connections on the socket. */
3292	for (n = 0; n < num_socks; n++) {
3293		sock = socks[n];
3294		if (listen(sock, SSH_LISTEN_BACKLOG) < 0) {
3295			error("listen: %.100s", strerror(errno));
3296			close(sock);
3297			return -1;
3298		}
3299	}
3300
3301	/* Allocate a channel for each socket. */
3302	*chanids = xcalloc(num_socks + 1, sizeof(**chanids));
3303	for (n = 0; n < num_socks; n++) {
3304		sock = socks[n];
3305		nc = channel_new("x11 listener",
3306		    SSH_CHANNEL_X11_LISTENER, sock, sock, -1,
3307		    CHAN_X11_WINDOW_DEFAULT, CHAN_X11_PACKET_DEFAULT,
3308		    0, "X11 inet listener", 1);
3309		nc->single_connection = single_connection;
3310		(*chanids)[n] = nc->self;
3311	}
3312	(*chanids)[n] = -1;
3313
3314	/* Return the display number for the DISPLAY environment variable. */
3315	*display_numberp = display_number;
3316	return (0);
3317}
3318
3319static int
3320connect_local_xsocket_path(const char *pathname)
3321{
3322	int sock;
3323	struct sockaddr_un addr;
3324
3325	sock = socket(AF_UNIX, SOCK_STREAM, 0);
3326	if (sock < 0)
3327		error("socket: %.100s", strerror(errno));
3328	memset(&addr, 0, sizeof(addr));
3329	addr.sun_family = AF_UNIX;
3330	strlcpy(addr.sun_path, pathname, sizeof addr.sun_path);
3331	if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) == 0)
3332		return sock;
3333	close(sock);
3334	error("connect %.100s: %.100s", addr.sun_path, strerror(errno));
3335	return -1;
3336}
3337
3338static int
3339connect_local_xsocket(u_int dnr)
3340{
3341	char buf[1024];
3342	snprintf(buf, sizeof buf, _PATH_UNIX_X, dnr);
3343	return connect_local_xsocket_path(buf);
3344}
3345
3346int
3347x11_connect_display(void)
3348{
3349	u_int display_number;
3350	const char *display;
3351	char buf[1024], *cp;
3352	struct addrinfo hints, *ai, *aitop;
3353	char strport[NI_MAXSERV];
3354	int gaierr, sock = 0;
3355
3356	/* Try to open a socket for the local X server. */
3357	display = getenv("DISPLAY");
3358	if (!display) {
3359		error("DISPLAY not set.");
3360		return -1;
3361	}
3362	/*
3363	 * Now we decode the value of the DISPLAY variable and make a
3364	 * connection to the real X server.
3365	 */
3366
3367	/* Check if the display is from launchd. */
3368#ifdef __APPLE__
3369	if (strncmp(display, "/tmp/launch", 11) == 0) {
3370		sock = connect_local_xsocket_path(display);
3371		if (sock < 0)
3372			return -1;
3373
3374		/* OK, we now have a connection to the display. */
3375		return sock;
3376	}
3377#endif
3378	/*
3379	 * Check if it is a unix domain socket.  Unix domain displays are in
3380	 * one of the following formats: unix:d[.s], :d[.s], ::d[.s]
3381	 */
3382	if (strncmp(display, "unix:", 5) == 0 ||
3383	    display[0] == ':') {
3384		/* Connect to the unix domain socket. */
3385		if (sscanf(strrchr(display, ':') + 1, "%u", &display_number) != 1) {
3386			error("Could not parse display number from DISPLAY: %.100s",
3387			    display);
3388			return -1;
3389		}
3390		/* Create a socket. */
3391		sock = connect_local_xsocket(display_number);
3392		if (sock < 0)
3393			return -1;
3394
3395		/* OK, we now have a connection to the display. */
3396		return sock;
3397	}
3398	/*
3399	 * Connect to an inet socket.  The DISPLAY value is supposedly
3400	 * hostname:d[.s], where hostname may also be numeric IP address.
3401	 */
3402	strlcpy(buf, display, sizeof(buf));
3403	cp = strchr(buf, ':');
3404	if (!cp) {
3405		error("Could not find ':' in DISPLAY: %.100s", display);
3406		return -1;
3407	}
3408	*cp = 0;
3409	/* buf now contains the host name.  But first we parse the display number. */
3410	if (sscanf(cp + 1, "%u", &display_number) != 1) {
3411		error("Could not parse display number from DISPLAY: %.100s",
3412		    display);
3413		return -1;
3414	}
3415
3416	/* Look up the host address */
3417	memset(&hints, 0, sizeof(hints));
3418	hints.ai_family = IPv4or6;
3419	hints.ai_socktype = SOCK_STREAM;
3420	snprintf(strport, sizeof strport, "%u", 6000 + display_number);
3421	if ((gaierr = getaddrinfo(buf, strport, &hints, &aitop)) != 0) {
3422		error("%.100s: unknown host. (%s)", buf,
3423		ssh_gai_strerror(gaierr));
3424		return -1;
3425	}
3426	for (ai = aitop; ai; ai = ai->ai_next) {
3427		/* Create a socket. */
3428		sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
3429		if (sock < 0) {
3430			debug2("socket: %.100s", strerror(errno));
3431			continue;
3432		}
3433		/* Connect it to the display. */
3434		if (connect(sock, ai->ai_addr, ai->ai_addrlen) < 0) {
3435			debug2("connect %.100s port %u: %.100s", buf,
3436			    6000 + display_number, strerror(errno));
3437			close(sock);
3438			continue;
3439		}
3440		/* Success */
3441		break;
3442	}
3443	freeaddrinfo(aitop);
3444	if (!ai) {
3445		error("connect %.100s port %u: %.100s", buf, 6000 + display_number,
3446		    strerror(errno));
3447		return -1;
3448	}
3449	set_nodelay(sock);
3450	return sock;
3451}
3452
3453/*
3454 * This is called when SSH_SMSG_X11_OPEN is received.  The packet contains
3455 * the remote channel number.  We should do whatever we want, and respond
3456 * with either SSH_MSG_OPEN_CONFIRMATION or SSH_MSG_OPEN_FAILURE.
3457 */
3458
3459/* ARGSUSED */
3460void
3461x11_input_open(int type, u_int32_t seq, void *ctxt)
3462{
3463	Channel *c = NULL;
3464	int remote_id, sock = 0;
3465	char *remote_host;
3466
3467	debug("Received X11 open request.");
3468
3469	remote_id = packet_get_int();
3470
3471	if (packet_get_protocol_flags() & SSH_PROTOFLAG_HOST_IN_FWD_OPEN) {
3472		remote_host = packet_get_string(NULL);
3473	} else {
3474		remote_host = xstrdup("unknown (remote did not supply name)");
3475	}
3476	packet_check_eom();
3477
3478	/* Obtain a connection to the real X display. */
3479	sock = x11_connect_display();
3480	if (sock != -1) {
3481		/* Allocate a channel for this connection. */
3482		c = channel_new("connected x11 socket",
3483		    SSH_CHANNEL_X11_OPEN, sock, sock, -1, 0, 0, 0,
3484		    remote_host, 1);
3485		c->remote_id = remote_id;
3486		c->force_drain = 1;
3487	}
3488	xfree(remote_host);
3489	if (c == NULL) {
3490		/* Send refusal to the remote host. */
3491		packet_start(SSH_MSG_CHANNEL_OPEN_FAILURE);
3492		packet_put_int(remote_id);
3493	} else {
3494		/* Send a confirmation to the remote host. */
3495		packet_start(SSH_MSG_CHANNEL_OPEN_CONFIRMATION);
3496		packet_put_int(remote_id);
3497		packet_put_int(c->self);
3498	}
3499	packet_send();
3500}
3501
3502/* dummy protocol handler that denies SSH-1 requests (agent/x11) */
3503/* ARGSUSED */
3504void
3505deny_input_open(int type, u_int32_t seq, void *ctxt)
3506{
3507	int rchan = packet_get_int();
3508
3509	switch (type) {
3510	case SSH_SMSG_AGENT_OPEN:
3511		error("Warning: ssh server tried agent forwarding.");
3512		break;
3513	case SSH_SMSG_X11_OPEN:
3514		error("Warning: ssh server tried X11 forwarding.");
3515		break;
3516	default:
3517		error("deny_input_open: type %d", type);
3518		break;
3519	}
3520	error("Warning: this is probably a break-in attempt by a malicious server.");
3521	packet_start(SSH_MSG_CHANNEL_OPEN_FAILURE);
3522	packet_put_int(rchan);
3523	packet_send();
3524}
3525
3526/*
3527 * Requests forwarding of X11 connections, generates fake authentication
3528 * data, and enables authentication spoofing.
3529 * This should be called in the client only.
3530 */
3531void
3532x11_request_forwarding_with_spoofing(int client_session_id, const char *disp,
3533    const char *proto, const char *data)
3534{
3535	u_int data_len = (u_int) strlen(data) / 2;
3536	u_int i, value;
3537	char *new_data;
3538	int screen_number;
3539	const char *cp;
3540	u_int32_t rnd = 0;
3541
3542	if (x11_saved_display == NULL)
3543		x11_saved_display = xstrdup(disp);
3544	else if (strcmp(disp, x11_saved_display) != 0) {
3545		error("x11_request_forwarding_with_spoofing: different "
3546		    "$DISPLAY already forwarded");
3547		return;
3548	}
3549
3550	cp = strchr(disp, ':');
3551	if (cp)
3552		cp = strchr(cp, '.');
3553	if (cp)
3554		screen_number = (u_int)strtonum(cp + 1, 0, 400, NULL);
3555	else
3556		screen_number = 0;
3557
3558	if (x11_saved_proto == NULL) {
3559		/* Save protocol name. */
3560		x11_saved_proto = xstrdup(proto);
3561		/*
3562		 * Extract real authentication data and generate fake data
3563		 * of the same length.
3564		 */
3565		x11_saved_data = xmalloc(data_len);
3566		x11_fake_data = xmalloc(data_len);
3567		for (i = 0; i < data_len; i++) {
3568			if (sscanf(data + 2 * i, "%2x", &value) != 1)
3569				fatal("x11_request_forwarding: bad "
3570				    "authentication data: %.100s", data);
3571			if (i % 4 == 0)
3572				rnd = arc4random();
3573			x11_saved_data[i] = value;
3574			x11_fake_data[i] = rnd & 0xff;
3575			rnd >>= 8;
3576		}
3577		x11_saved_data_len = data_len;
3578		x11_fake_data_len = data_len;
3579	}
3580
3581	/* Convert the fake data into hex. */
3582	new_data = tohex(x11_fake_data, data_len);
3583
3584	/* Send the request packet. */
3585	if (compat20) {
3586		channel_request_start(client_session_id, "x11-req", 0);
3587		packet_put_char(0);	/* XXX bool single connection */
3588	} else {
3589		packet_start(SSH_CMSG_X11_REQUEST_FORWARDING);
3590	}
3591	packet_put_cstring(proto);
3592	packet_put_cstring(new_data);
3593	packet_put_int(screen_number);
3594	packet_send();
3595	packet_write_wait();
3596	xfree(new_data);
3597}
3598
3599
3600/* -- agent forwarding */
3601
3602/* Sends a message to the server to request authentication fd forwarding. */
3603
3604void
3605auth_request_forwarding(void)
3606{
3607	packet_start(SSH_CMSG_AGENT_REQUEST_FORWARDING);
3608	packet_send();
3609	packet_write_wait();
3610}
3611