xref: /openbsd-src/usr.bin/ssh/channels.c (revision 3a3fbb3f2e2521ab7c4a56b7ff7462ebd9095ec5)
1 /*
2  * Author: Tatu Ylonen <ylo@cs.hut.fi>
3  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
4  *                    All rights reserved
5  * This file contains functions for generic socket connection forwarding.
6  * There is also code for initiating connection forwarding for X11 connections,
7  * arbitrary tcp/ip connections, and the authentication agent connection.
8  *
9  * As far as I am concerned, the code I have written for this software
10  * can be used freely for any purpose.  Any derived versions of this
11  * software must be clearly marked as such, and if the derived work is
12  * incompatible with the protocol description in the RFC file, it must be
13  * called by a name other than "ssh" or "Secure Shell".
14  *
15  * SSH2 support added by Markus Friedl.
16  * Copyright (c) 1999, 2000, 2001 Markus Friedl.  All rights reserved.
17  * Copyright (c) 1999 Dug Song.  All rights reserved.
18  * Copyright (c) 1999 Theo de Raadt.  All rights reserved.
19  *
20  * Redistribution and use in source and binary forms, with or without
21  * modification, are permitted provided that the following conditions
22  * are met:
23  * 1. Redistributions of source code must retain the above copyright
24  *    notice, this list of conditions and the following disclaimer.
25  * 2. Redistributions in binary form must reproduce the above copyright
26  *    notice, this list of conditions and the following disclaimer in the
27  *    documentation and/or other materials provided with the distribution.
28  *
29  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
30  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
31  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
32  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
33  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
34  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
35  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
36  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
37  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
38  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39  */
40 
41 #include "includes.h"
42 RCSID("$OpenBSD: channels.c,v 1.155 2001/12/29 21:56:01 stevesk Exp $");
43 
44 #include "ssh.h"
45 #include "ssh1.h"
46 #include "ssh2.h"
47 #include "packet.h"
48 #include "xmalloc.h"
49 #include "uidswap.h"
50 #include "log.h"
51 #include "misc.h"
52 #include "channels.h"
53 #include "compat.h"
54 #include "canohost.h"
55 #include "key.h"
56 #include "authfd.h"
57 #include "pathnames.h"
58 
59 
60 /* -- channel core */
61 
62 /*
63  * Pointer to an array containing all allocated channels.  The array is
64  * dynamically extended as needed.
65  */
66 static Channel **channels = NULL;
67 
68 /*
69  * Size of the channel array.  All slots of the array must always be
70  * initialized (at least the type field); unused slots set to NULL
71  */
72 static int channels_alloc = 0;
73 
74 /*
75  * Maximum file descriptor value used in any of the channels.  This is
76  * updated in channel_new.
77  */
78 static int channel_max_fd = 0;
79 
80 
81 /* -- tcp forwarding */
82 
83 /*
84  * Data structure for storing which hosts are permitted for forward requests.
85  * The local sides of any remote forwards are stored in this array to prevent
86  * a corrupt remote server from accessing arbitrary TCP/IP ports on our local
87  * network (which might be behind a firewall).
88  */
89 typedef struct {
90 	char *host_to_connect;		/* Connect to 'host'. */
91 	u_short port_to_connect;	/* Connect to 'port'. */
92 	u_short listen_port;		/* Remote side should listen port number. */
93 } ForwardPermission;
94 
95 /* List of all permitted host/port pairs to connect. */
96 static ForwardPermission permitted_opens[SSH_MAX_FORWARDS_PER_DIRECTION];
97 
98 /* Number of permitted host/port pairs in the array. */
99 static int num_permitted_opens = 0;
100 /*
101  * If this is true, all opens are permitted.  This is the case on the server
102  * on which we have to trust the client anyway, and the user could do
103  * anything after logging in anyway.
104  */
105 static int all_opens_permitted = 0;
106 
107 
108 /* -- X11 forwarding */
109 
110 /* Maximum number of fake X11 displays to try. */
111 #define MAX_DISPLAYS  1000
112 
113 /* Saved X11 authentication protocol name. */
114 static char *x11_saved_proto = NULL;
115 
116 /* Saved X11 authentication data.  This is the real data. */
117 static char *x11_saved_data = NULL;
118 static u_int x11_saved_data_len = 0;
119 
120 /*
121  * Fake X11 authentication data.  This is what the server will be sending us;
122  * we should replace any occurrences of this by the real data.
123  */
124 static char *x11_fake_data = NULL;
125 static u_int x11_fake_data_len;
126 
127 
128 /* -- agent forwarding */
129 
130 #define	NUM_SOCKS	10
131 
132 /* Name and directory of socket for authentication agent forwarding. */
133 static char *auth_sock_name = NULL;
134 static char *auth_sock_dir = NULL;
135 
136 /* AF_UNSPEC or AF_INET or AF_INET6 */
137 static int IPv4or6 = AF_UNSPEC;
138 
139 /* helper */
140 static void port_open_helper(Channel *c, char *rtype);
141 
142 /* -- channel core */
143 
144 Channel *
145 channel_lookup(int id)
146 {
147 	Channel *c;
148 
149 	if (id < 0 || id > channels_alloc) {
150 		log("channel_lookup: %d: bad id", id);
151 		return NULL;
152 	}
153 	c = channels[id];
154 	if (c == NULL) {
155 		log("channel_lookup: %d: bad id: channel free", id);
156 		return NULL;
157 	}
158 	return c;
159 }
160 
161 /*
162  * Register filedescriptors for a channel, used when allocating a channel or
163  * when the channel consumer/producer is ready, e.g. shell exec'd
164  */
165 
166 static void
167 channel_register_fds(Channel *c, int rfd, int wfd, int efd,
168     int extusage, int nonblock)
169 {
170 	/* Update the maximum file descriptor value. */
171 	channel_max_fd = MAX(channel_max_fd, rfd);
172 	channel_max_fd = MAX(channel_max_fd, wfd);
173 	channel_max_fd = MAX(channel_max_fd, efd);
174 
175 	/* XXX set close-on-exec -markus */
176 
177 	c->rfd = rfd;
178 	c->wfd = wfd;
179 	c->sock = (rfd == wfd) ? rfd : -1;
180 	c->efd = efd;
181 	c->extended_usage = extusage;
182 
183 	/* XXX ugly hack: nonblock is only set by the server */
184 	if (nonblock && isatty(c->rfd)) {
185 		debug("channel %d: rfd %d isatty", c->self, c->rfd);
186 		c->isatty = 1;
187 		if (!isatty(c->wfd)) {
188 			error("channel %d: wfd %d is not a tty?",
189 			    c->self, c->wfd);
190 		}
191 	} else {
192 		c->isatty = 0;
193 	}
194 
195 	/* enable nonblocking mode */
196 	if (nonblock) {
197 		if (rfd != -1)
198 			set_nonblock(rfd);
199 		if (wfd != -1)
200 			set_nonblock(wfd);
201 		if (efd != -1)
202 			set_nonblock(efd);
203 	}
204 }
205 
206 /*
207  * Allocate a new channel object and set its type and socket. This will cause
208  * remote_name to be freed.
209  */
210 
211 Channel *
212 channel_new(char *ctype, int type, int rfd, int wfd, int efd,
213     int window, int maxpack, int extusage, char *remote_name, int nonblock)
214 {
215 	int i, found;
216 	Channel *c;
217 
218 	/* Do initial allocation if this is the first call. */
219 	if (channels_alloc == 0) {
220 		chan_init();
221 		channels_alloc = 10;
222 		channels = xmalloc(channels_alloc * sizeof(Channel *));
223 		for (i = 0; i < channels_alloc; i++)
224 			channels[i] = NULL;
225 		fatal_add_cleanup((void (*) (void *)) channel_free_all, NULL);
226 	}
227 	/* Try to find a free slot where to put the new channel. */
228 	for (found = -1, i = 0; i < channels_alloc; i++)
229 		if (channels[i] == NULL) {
230 			/* Found a free slot. */
231 			found = i;
232 			break;
233 		}
234 	if (found == -1) {
235 		/* There are no free slots.  Take last+1 slot and expand the array.  */
236 		found = channels_alloc;
237 		channels_alloc += 10;
238 		debug2("channel: expanding %d", channels_alloc);
239 		channels = xrealloc(channels, channels_alloc * sizeof(Channel *));
240 		for (i = found; i < channels_alloc; i++)
241 			channels[i] = NULL;
242 	}
243 	/* Initialize and return new channel. */
244 	c = channels[found] = xmalloc(sizeof(Channel));
245 	memset(c, 0, sizeof(Channel));
246 	buffer_init(&c->input);
247 	buffer_init(&c->output);
248 	buffer_init(&c->extended);
249 	chan_init_iostates(c);
250 	channel_register_fds(c, rfd, wfd, efd, extusage, nonblock);
251 	c->self = found;
252 	c->type = type;
253 	c->ctype = ctype;
254 	c->local_window = window;
255 	c->local_window_max = window;
256 	c->local_consumed = 0;
257 	c->local_maxpacket = maxpack;
258 	c->remote_id = -1;
259 	c->remote_name = remote_name;
260 	c->remote_window = 0;
261 	c->remote_maxpacket = 0;
262 	c->cb_fn = NULL;
263 	c->cb_arg = NULL;
264 	c->cb_event = 0;
265 	c->force_drain = 0;
266 	c->single_connection = 0;
267 	c->detach_user = NULL;
268 	c->input_filter = NULL;
269 	debug("channel %d: new [%s]", found, remote_name);
270 	return c;
271 }
272 
273 static int
274 channel_find_maxfd(void)
275 {
276 	int i, max = 0;
277 	Channel *c;
278 
279 	for (i = 0; i < channels_alloc; i++) {
280 		c = channels[i];
281 		if (c != NULL) {
282 			max = MAX(max, c->rfd);
283 			max = MAX(max, c->wfd);
284 			max = MAX(max, c->efd);
285 		}
286 	}
287 	return max;
288 }
289 
290 int
291 channel_close_fd(int *fdp)
292 {
293 	int ret = 0, fd = *fdp;
294 
295 	if (fd != -1) {
296 		ret = close(fd);
297 		*fdp = -1;
298 		if (fd == channel_max_fd)
299 			channel_max_fd = channel_find_maxfd();
300 	}
301 	return ret;
302 }
303 
304 /* Close all channel fd/socket. */
305 
306 static void
307 channel_close_fds(Channel *c)
308 {
309 	debug3("channel_close_fds: channel %d: r %d w %d e %d",
310 	    c->self, c->rfd, c->wfd, c->efd);
311 
312 	channel_close_fd(&c->sock);
313 	channel_close_fd(&c->rfd);
314 	channel_close_fd(&c->wfd);
315 	channel_close_fd(&c->efd);
316 }
317 
318 /* Free the channel and close its fd/socket. */
319 
320 void
321 channel_free(Channel *c)
322 {
323 	char *s;
324 	int i, n;
325 
326 	for (n = 0, i = 0; i < channels_alloc; i++)
327 		if (channels[i])
328 			n++;
329 	debug("channel_free: channel %d: %s, nchannels %d", c->self,
330 	    c->remote_name ? c->remote_name : "???", n);
331 
332 	s = channel_open_message();
333 	debug3("channel_free: status: %s", s);
334 	xfree(s);
335 
336 	if (c->sock != -1)
337 		shutdown(c->sock, SHUT_RDWR);
338 	channel_close_fds(c);
339 	buffer_free(&c->input);
340 	buffer_free(&c->output);
341 	buffer_free(&c->extended);
342 	if (c->remote_name) {
343 		xfree(c->remote_name);
344 		c->remote_name = NULL;
345 	}
346 	channels[c->self] = NULL;
347 	xfree(c);
348 }
349 
350 void
351 channel_free_all(void)
352 {
353 	int i;
354 
355 	for (i = 0; i < channels_alloc; i++)
356 		if (channels[i] != NULL)
357 			channel_free(channels[i]);
358 }
359 
360 /*
361  * Closes the sockets/fds of all channels.  This is used to close extra file
362  * descriptors after a fork.
363  */
364 
365 void
366 channel_close_all(void)
367 {
368 	int i;
369 
370 	for (i = 0; i < channels_alloc; i++)
371 		if (channels[i] != NULL)
372 			channel_close_fds(channels[i]);
373 }
374 
375 /*
376  * Stop listening to channels.
377  */
378 
379 void
380 channel_stop_listening(void)
381 {
382 	int i;
383 	Channel *c;
384 
385 	for (i = 0; i < channels_alloc; i++) {
386 		c = channels[i];
387 		if (c != NULL) {
388 			switch (c->type) {
389 			case SSH_CHANNEL_AUTH_SOCKET:
390 			case SSH_CHANNEL_PORT_LISTENER:
391 			case SSH_CHANNEL_RPORT_LISTENER:
392 			case SSH_CHANNEL_X11_LISTENER:
393 				channel_close_fd(&c->sock);
394 				channel_free(c);
395 				break;
396 			}
397 		}
398 	}
399 }
400 
401 /*
402  * Returns true if no channel has too much buffered data, and false if one or
403  * more channel is overfull.
404  */
405 
406 int
407 channel_not_very_much_buffered_data(void)
408 {
409 	u_int i;
410 	Channel *c;
411 
412 	for (i = 0; i < channels_alloc; i++) {
413 		c = channels[i];
414 		if (c != NULL && c->type == SSH_CHANNEL_OPEN) {
415 #if 0
416 			if (!compat20 &&
417 			    buffer_len(&c->input) > packet_get_maxsize()) {
418 				debug("channel %d: big input buffer %d",
419 				    c->self, buffer_len(&c->input));
420 				return 0;
421 			}
422 #endif
423 			if (buffer_len(&c->output) > packet_get_maxsize()) {
424 				debug("channel %d: big output buffer %d > %d",
425 				    c->self, buffer_len(&c->output),
426 				    packet_get_maxsize());
427 				return 0;
428 			}
429 		}
430 	}
431 	return 1;
432 }
433 
434 /* Returns true if any channel is still open. */
435 
436 int
437 channel_still_open(void)
438 {
439 	int i;
440 	Channel *c;
441 
442 	for (i = 0; i < channels_alloc; i++) {
443 		c = channels[i];
444 		if (c == NULL)
445 			continue;
446 		switch (c->type) {
447 		case SSH_CHANNEL_X11_LISTENER:
448 		case SSH_CHANNEL_PORT_LISTENER:
449 		case SSH_CHANNEL_RPORT_LISTENER:
450 		case SSH_CHANNEL_CLOSED:
451 		case SSH_CHANNEL_AUTH_SOCKET:
452 		case SSH_CHANNEL_DYNAMIC:
453 		case SSH_CHANNEL_CONNECTING:
454 		case SSH_CHANNEL_ZOMBIE:
455 			continue;
456 		case SSH_CHANNEL_LARVAL:
457 			if (!compat20)
458 				fatal("cannot happen: SSH_CHANNEL_LARVAL");
459 			continue;
460 		case SSH_CHANNEL_OPENING:
461 		case SSH_CHANNEL_OPEN:
462 		case SSH_CHANNEL_X11_OPEN:
463 			return 1;
464 		case SSH_CHANNEL_INPUT_DRAINING:
465 		case SSH_CHANNEL_OUTPUT_DRAINING:
466 			if (!compat13)
467 				fatal("cannot happen: OUT_DRAIN");
468 			return 1;
469 		default:
470 			fatal("channel_still_open: bad channel type %d", c->type);
471 			/* NOTREACHED */
472 		}
473 	}
474 	return 0;
475 }
476 
477 /* Returns the id of an open channel suitable for keepaliving */
478 
479 int
480 channel_find_open(void)
481 {
482 	int i;
483 	Channel *c;
484 
485 	for (i = 0; i < channels_alloc; i++) {
486 		c = channels[i];
487 		if (c == NULL)
488 			continue;
489 		switch (c->type) {
490 		case SSH_CHANNEL_CLOSED:
491 		case SSH_CHANNEL_DYNAMIC:
492 		case SSH_CHANNEL_X11_LISTENER:
493 		case SSH_CHANNEL_PORT_LISTENER:
494 		case SSH_CHANNEL_RPORT_LISTENER:
495 		case SSH_CHANNEL_OPENING:
496 		case SSH_CHANNEL_CONNECTING:
497 		case SSH_CHANNEL_ZOMBIE:
498 			continue;
499 		case SSH_CHANNEL_LARVAL:
500 		case SSH_CHANNEL_AUTH_SOCKET:
501 		case SSH_CHANNEL_OPEN:
502 		case SSH_CHANNEL_X11_OPEN:
503 			return i;
504 		case SSH_CHANNEL_INPUT_DRAINING:
505 		case SSH_CHANNEL_OUTPUT_DRAINING:
506 			if (!compat13)
507 				fatal("cannot happen: OUT_DRAIN");
508 			return i;
509 		default:
510 			fatal("channel_find_open: bad channel type %d", c->type);
511 			/* NOTREACHED */
512 		}
513 	}
514 	return -1;
515 }
516 
517 
518 /*
519  * Returns a message describing the currently open forwarded connections,
520  * suitable for sending to the client.  The message contains crlf pairs for
521  * newlines.
522  */
523 
524 char *
525 channel_open_message(void)
526 {
527 	Buffer buffer;
528 	Channel *c;
529 	char buf[1024], *cp;
530 	int i;
531 
532 	buffer_init(&buffer);
533 	snprintf(buf, sizeof buf, "The following connections are open:\r\n");
534 	buffer_append(&buffer, buf, strlen(buf));
535 	for (i = 0; i < channels_alloc; i++) {
536 		c = channels[i];
537 		if (c == NULL)
538 			continue;
539 		switch (c->type) {
540 		case SSH_CHANNEL_X11_LISTENER:
541 		case SSH_CHANNEL_PORT_LISTENER:
542 		case SSH_CHANNEL_RPORT_LISTENER:
543 		case SSH_CHANNEL_CLOSED:
544 		case SSH_CHANNEL_AUTH_SOCKET:
545 		case SSH_CHANNEL_ZOMBIE:
546 			continue;
547 		case SSH_CHANNEL_LARVAL:
548 		case SSH_CHANNEL_OPENING:
549 		case SSH_CHANNEL_CONNECTING:
550 		case SSH_CHANNEL_DYNAMIC:
551 		case SSH_CHANNEL_OPEN:
552 		case SSH_CHANNEL_X11_OPEN:
553 		case SSH_CHANNEL_INPUT_DRAINING:
554 		case SSH_CHANNEL_OUTPUT_DRAINING:
555 			snprintf(buf, sizeof buf, "  #%d %.300s (t%d r%d i%d/%d o%d/%d fd %d/%d)\r\n",
556 			    c->self, c->remote_name,
557 			    c->type, c->remote_id,
558 			    c->istate, buffer_len(&c->input),
559 			    c->ostate, buffer_len(&c->output),
560 			    c->rfd, c->wfd);
561 			buffer_append(&buffer, buf, strlen(buf));
562 			continue;
563 		default:
564 			fatal("channel_open_message: bad channel type %d", c->type);
565 			/* NOTREACHED */
566 		}
567 	}
568 	buffer_append(&buffer, "\0", 1);
569 	cp = xstrdup(buffer_ptr(&buffer));
570 	buffer_free(&buffer);
571 	return cp;
572 }
573 
574 void
575 channel_send_open(int id)
576 {
577 	Channel *c = channel_lookup(id);
578 	if (c == NULL) {
579 		log("channel_send_open: %d: bad id", id);
580 		return;
581 	}
582 	debug("send channel open %d", id);
583 	packet_start(SSH2_MSG_CHANNEL_OPEN);
584 	packet_put_cstring(c->ctype);
585 	packet_put_int(c->self);
586 	packet_put_int(c->local_window);
587 	packet_put_int(c->local_maxpacket);
588 	packet_send();
589 }
590 
591 void
592 channel_request(int id, char *service, int wantconfirm)
593 {
594 	channel_request_start(id, service, wantconfirm);
595 	packet_send();
596 	debug("channel request %d: %s", id, service) ;
597 }
598 void
599 channel_request_start(int id, char *service, int wantconfirm)
600 {
601 	Channel *c = channel_lookup(id);
602 	if (c == NULL) {
603 		log("channel_request: %d: bad id", id);
604 		return;
605 	}
606 	packet_start(SSH2_MSG_CHANNEL_REQUEST);
607 	packet_put_int(c->remote_id);
608 	packet_put_cstring(service);
609 	packet_put_char(wantconfirm);
610 }
611 void
612 channel_register_callback(int id, int mtype, channel_callback_fn *fn, void *arg)
613 {
614 	Channel *c = channel_lookup(id);
615 	if (c == NULL) {
616 		log("channel_register_callback: %d: bad id", id);
617 		return;
618 	}
619 	c->cb_event = mtype;
620 	c->cb_fn = fn;
621 	c->cb_arg = arg;
622 }
623 void
624 channel_register_cleanup(int id, channel_callback_fn *fn)
625 {
626 	Channel *c = channel_lookup(id);
627 	if (c == NULL) {
628 		log("channel_register_cleanup: %d: bad id", id);
629 		return;
630 	}
631 	c->detach_user = fn;
632 }
633 void
634 channel_cancel_cleanup(int id)
635 {
636 	Channel *c = channel_lookup(id);
637 	if (c == NULL) {
638 		log("channel_cancel_cleanup: %d: bad id", id);
639 		return;
640 	}
641 	c->detach_user = NULL;
642 }
643 void
644 channel_register_filter(int id, channel_filter_fn *fn)
645 {
646 	Channel *c = channel_lookup(id);
647 	if (c == NULL) {
648 		log("channel_register_filter: %d: bad id", id);
649 		return;
650 	}
651 	c->input_filter = fn;
652 }
653 
654 void
655 channel_set_fds(int id, int rfd, int wfd, int efd,
656     int extusage, int nonblock)
657 {
658 	Channel *c = channel_lookup(id);
659 	if (c == NULL || c->type != SSH_CHANNEL_LARVAL)
660 		fatal("channel_activate for non-larval channel %d.", id);
661 	channel_register_fds(c, rfd, wfd, efd, extusage, nonblock);
662 	c->type = SSH_CHANNEL_OPEN;
663 	/* XXX window size? */
664 	c->local_window = c->local_window_max = c->local_maxpacket * 2;
665 	packet_start(SSH2_MSG_CHANNEL_WINDOW_ADJUST);
666 	packet_put_int(c->remote_id);
667 	packet_put_int(c->local_window);
668 	packet_send();
669 }
670 
671 /*
672  * 'channel_pre*' are called just before select() to add any bits relevant to
673  * channels in the select bitmasks.
674  */
675 /*
676  * 'channel_post*': perform any appropriate operations for channels which
677  * have events pending.
678  */
679 typedef void chan_fn(Channel *c, fd_set * readset, fd_set * writeset);
680 chan_fn *channel_pre[SSH_CHANNEL_MAX_TYPE];
681 chan_fn *channel_post[SSH_CHANNEL_MAX_TYPE];
682 
683 static void
684 channel_pre_listener(Channel *c, fd_set * readset, fd_set * writeset)
685 {
686 	FD_SET(c->sock, readset);
687 }
688 
689 static void
690 channel_pre_connecting(Channel *c, fd_set * readset, fd_set * writeset)
691 {
692 	debug3("channel %d: waiting for connection", c->self);
693 	FD_SET(c->sock, writeset);
694 }
695 
696 static void
697 channel_pre_open_13(Channel *c, fd_set * readset, fd_set * writeset)
698 {
699 	if (buffer_len(&c->input) < packet_get_maxsize())
700 		FD_SET(c->sock, readset);
701 	if (buffer_len(&c->output) > 0)
702 		FD_SET(c->sock, writeset);
703 }
704 
705 static void
706 channel_pre_open_15(Channel *c, fd_set * readset, fd_set * writeset)
707 {
708 	/* test whether sockets are 'alive' for read/write */
709 	if (c->istate == CHAN_INPUT_OPEN)
710 		if (buffer_len(&c->input) < packet_get_maxsize())
711 			FD_SET(c->sock, readset);
712 	if (c->ostate == CHAN_OUTPUT_OPEN ||
713 	    c->ostate == CHAN_OUTPUT_WAIT_DRAIN) {
714 		if (buffer_len(&c->output) > 0) {
715 			FD_SET(c->sock, writeset);
716 		} else if (c->ostate == CHAN_OUTPUT_WAIT_DRAIN) {
717 			chan_obuf_empty(c);
718 		}
719 	}
720 }
721 
722 static void
723 channel_pre_open_20(Channel *c, fd_set * readset, fd_set * writeset)
724 {
725 	if (c->istate == CHAN_INPUT_OPEN &&
726 	    c->remote_window > 0 &&
727 	    buffer_len(&c->input) < c->remote_window)
728 		FD_SET(c->rfd, readset);
729 	if (c->ostate == CHAN_OUTPUT_OPEN ||
730 	    c->ostate == CHAN_OUTPUT_WAIT_DRAIN) {
731 		if (buffer_len(&c->output) > 0) {
732 			FD_SET(c->wfd, writeset);
733 		} else if (c->ostate == CHAN_OUTPUT_WAIT_DRAIN) {
734 			chan_obuf_empty(c);
735 		}
736 	}
737 	/** XXX check close conditions, too */
738 	if (c->efd != -1) {
739 		if (c->extended_usage == CHAN_EXTENDED_WRITE &&
740 		    buffer_len(&c->extended) > 0)
741 			FD_SET(c->efd, writeset);
742 		else if (c->extended_usage == CHAN_EXTENDED_READ &&
743 		    buffer_len(&c->extended) < c->remote_window)
744 			FD_SET(c->efd, readset);
745 	}
746 }
747 
748 static void
749 channel_pre_input_draining(Channel *c, fd_set * readset, fd_set * writeset)
750 {
751 	if (buffer_len(&c->input) == 0) {
752 		packet_start(SSH_MSG_CHANNEL_CLOSE);
753 		packet_put_int(c->remote_id);
754 		packet_send();
755 		c->type = SSH_CHANNEL_CLOSED;
756 		debug("channel %d: closing after input drain.", c->self);
757 	}
758 }
759 
760 static void
761 channel_pre_output_draining(Channel *c, fd_set * readset, fd_set * writeset)
762 {
763 	if (buffer_len(&c->output) == 0)
764 		chan_mark_dead(c);
765 	else
766 		FD_SET(c->sock, writeset);
767 }
768 
769 /*
770  * This is a special state for X11 authentication spoofing.  An opened X11
771  * connection (when authentication spoofing is being done) remains in this
772  * state until the first packet has been completely read.  The authentication
773  * data in that packet is then substituted by the real data if it matches the
774  * fake data, and the channel is put into normal mode.
775  * XXX All this happens at the client side.
776  * Returns: 0 = need more data, -1 = wrong cookie, 1 = ok
777  */
778 static int
779 x11_open_helper(Buffer *b)
780 {
781 	u_char *ucp;
782 	u_int proto_len, data_len;
783 
784 	/* Check if the fixed size part of the packet is in buffer. */
785 	if (buffer_len(b) < 12)
786 		return 0;
787 
788 	/* Parse the lengths of variable-length fields. */
789 	ucp = buffer_ptr(b);
790 	if (ucp[0] == 0x42) {	/* Byte order MSB first. */
791 		proto_len = 256 * ucp[6] + ucp[7];
792 		data_len = 256 * ucp[8] + ucp[9];
793 	} else if (ucp[0] == 0x6c) {	/* Byte order LSB first. */
794 		proto_len = ucp[6] + 256 * ucp[7];
795 		data_len = ucp[8] + 256 * ucp[9];
796 	} else {
797 		debug("Initial X11 packet contains bad byte order byte: 0x%x",
798 		    ucp[0]);
799 		return -1;
800 	}
801 
802 	/* Check if the whole packet is in buffer. */
803 	if (buffer_len(b) <
804 	    12 + ((proto_len + 3) & ~3) + ((data_len + 3) & ~3))
805 		return 0;
806 
807 	/* Check if authentication protocol matches. */
808 	if (proto_len != strlen(x11_saved_proto) ||
809 	    memcmp(ucp + 12, x11_saved_proto, proto_len) != 0) {
810 		debug("X11 connection uses different authentication protocol.");
811 		return -1;
812 	}
813 	/* Check if authentication data matches our fake data. */
814 	if (data_len != x11_fake_data_len ||
815 	    memcmp(ucp + 12 + ((proto_len + 3) & ~3),
816 		x11_fake_data, x11_fake_data_len) != 0) {
817 		debug("X11 auth data does not match fake data.");
818 		return -1;
819 	}
820 	/* Check fake data length */
821 	if (x11_fake_data_len != x11_saved_data_len) {
822 		error("X11 fake_data_len %d != saved_data_len %d",
823 		    x11_fake_data_len, x11_saved_data_len);
824 		return -1;
825 	}
826 	/*
827 	 * Received authentication protocol and data match
828 	 * our fake data. Substitute the fake data with real
829 	 * data.
830 	 */
831 	memcpy(ucp + 12 + ((proto_len + 3) & ~3),
832 	    x11_saved_data, x11_saved_data_len);
833 	return 1;
834 }
835 
836 static void
837 channel_pre_x11_open_13(Channel *c, fd_set * readset, fd_set * writeset)
838 {
839 	int ret = x11_open_helper(&c->output);
840 	if (ret == 1) {
841 		/* Start normal processing for the channel. */
842 		c->type = SSH_CHANNEL_OPEN;
843 		channel_pre_open_13(c, readset, writeset);
844 	} else if (ret == -1) {
845 		/*
846 		 * We have received an X11 connection that has bad
847 		 * authentication information.
848 		 */
849 		log("X11 connection rejected because of wrong authentication.");
850 		buffer_clear(&c->input);
851 		buffer_clear(&c->output);
852 		channel_close_fd(&c->sock);
853 		c->sock = -1;
854 		c->type = SSH_CHANNEL_CLOSED;
855 		packet_start(SSH_MSG_CHANNEL_CLOSE);
856 		packet_put_int(c->remote_id);
857 		packet_send();
858 	}
859 }
860 
861 static void
862 channel_pre_x11_open(Channel *c, fd_set * readset, fd_set * writeset)
863 {
864 	int ret = x11_open_helper(&c->output);
865 
866 	/* c->force_drain = 1; */
867 
868 	if (ret == 1) {
869 		c->type = SSH_CHANNEL_OPEN;
870 		if (compat20)
871 			channel_pre_open_20(c, readset, writeset);
872 		else
873 			channel_pre_open_15(c, readset, writeset);
874 	} else if (ret == -1) {
875 		debug("X11 rejected %d i%d/o%d", c->self, c->istate, c->ostate);
876 		chan_read_failed(c);	/** force close? */
877 		chan_write_failed(c);
878 		debug("X11 closed %d i%d/o%d", c->self, c->istate, c->ostate);
879 	}
880 }
881 
882 /* try to decode a socks4 header */
883 static int
884 channel_decode_socks4(Channel *c, fd_set * readset, fd_set * writeset)
885 {
886 	u_char *p, *host;
887 	int len, have, i, found;
888 	char username[256];
889 	struct {
890 		u_int8_t version;
891 		u_int8_t command;
892 		u_int16_t dest_port;
893 		struct in_addr dest_addr;
894 	} s4_req, s4_rsp;
895 
896 	debug2("channel %d: decode socks4", c->self);
897 
898 	have = buffer_len(&c->input);
899 	len = sizeof(s4_req);
900 	if (have < len)
901 		return 0;
902 	p = buffer_ptr(&c->input);
903 	for (found = 0, i = len; i < have; i++) {
904 		if (p[i] == '\0') {
905 			found = 1;
906 			break;
907 		}
908 		if (i > 1024) {
909 			/* the peer is probably sending garbage */
910 			debug("channel %d: decode socks4: too long",
911 			    c->self);
912 			return -1;
913 		}
914 	}
915 	if (!found)
916 		return 0;
917 	buffer_get(&c->input, (char *)&s4_req.version, 1);
918 	buffer_get(&c->input, (char *)&s4_req.command, 1);
919 	buffer_get(&c->input, (char *)&s4_req.dest_port, 2);
920 	buffer_get(&c->input, (char *)&s4_req.dest_addr, 4);
921 	have = buffer_len(&c->input);
922 	p = buffer_ptr(&c->input);
923 	len = strlen(p);
924 	debug2("channel %d: decode socks4: user %s/%d", c->self, p, len);
925 	if (len > have)
926 		fatal("channel %d: decode socks4: len %d > have %d",
927 		    c->self, len, have);
928 	strlcpy(username, p, sizeof(username));
929 	buffer_consume(&c->input, len);
930 	buffer_consume(&c->input, 1);		/* trailing '\0' */
931 
932 	host = inet_ntoa(s4_req.dest_addr);
933 	strlcpy(c->path, host, sizeof(c->path));
934 	c->host_port = ntohs(s4_req.dest_port);
935 
936 	debug("channel %d: dynamic request: socks4 host %s port %u command %u",
937 	    c->self, host, c->host_port, s4_req.command);
938 
939 	if (s4_req.command != 1) {
940 		debug("channel %d: cannot handle: socks4 cn %d",
941 		    c->self, s4_req.command);
942 		return -1;
943 	}
944 	s4_rsp.version = 0;			/* vn: 0 for reply */
945 	s4_rsp.command = 90;			/* cd: req granted */
946 	s4_rsp.dest_port = 0;			/* ignored */
947 	s4_rsp.dest_addr.s_addr = INADDR_ANY;	/* ignored */
948 	buffer_append(&c->output, (char *)&s4_rsp, sizeof(s4_rsp));
949 	return 1;
950 }
951 
952 /* dynamic port forwarding */
953 static void
954 channel_pre_dynamic(Channel *c, fd_set * readset, fd_set * writeset)
955 {
956 	u_char *p;
957 	int have, ret;
958 
959 	have = buffer_len(&c->input);
960 	c->delayed = 0;
961 	debug2("channel %d: pre_dynamic: have %d", c->self, have);
962 	/* buffer_dump(&c->input); */
963 	/* check if the fixed size part of the packet is in buffer. */
964 	if (have < 4) {
965 		/* need more */
966 		FD_SET(c->sock, readset);
967 		return;
968 	}
969 	/* try to guess the protocol */
970 	p = buffer_ptr(&c->input);
971 	switch (p[0]) {
972 	case 0x04:
973 		ret = channel_decode_socks4(c, readset, writeset);
974 		break;
975 	default:
976 		ret = -1;
977 		break;
978 	}
979 	if (ret < 0) {
980 		chan_mark_dead(c);
981 	} else if (ret == 0) {
982 		debug2("channel %d: pre_dynamic: need more", c->self);
983 		/* need more */
984 		FD_SET(c->sock, readset);
985 	} else {
986 		/* switch to the next state */
987 		c->type = SSH_CHANNEL_OPENING;
988 		port_open_helper(c, "direct-tcpip");
989 	}
990 }
991 
992 /* This is our fake X11 server socket. */
993 static void
994 channel_post_x11_listener(Channel *c, fd_set * readset, fd_set * writeset)
995 {
996 	Channel *nc;
997 	struct sockaddr addr;
998 	int newsock, on = 1;
999 	socklen_t addrlen;
1000 	char buf[16384], *remote_ipaddr;
1001 	int remote_port;
1002 
1003 	if (FD_ISSET(c->sock, readset)) {
1004 		debug("X11 connection requested.");
1005 		addrlen = sizeof(addr);
1006 		newsock = accept(c->sock, &addr, &addrlen);
1007 		if (c->single_connection) {
1008 			debug("single_connection: closing X11 listener.");
1009 			channel_close_fd(&c->sock);
1010 			chan_mark_dead(c);
1011 		}
1012 		if (newsock < 0) {
1013 			error("accept: %.100s", strerror(errno));
1014 			return;
1015 		}
1016 		if (setsockopt(newsock, IPPROTO_TCP, TCP_NODELAY, &on,
1017 		    sizeof on) == -1)
1018 			error("setsockopt TCP_NODELAY: %.100s",
1019 			    strerror(errno));
1020 		remote_ipaddr = get_peer_ipaddr(newsock);
1021 		remote_port = get_peer_port(newsock);
1022 		snprintf(buf, sizeof buf, "X11 connection from %.200s port %d",
1023 		    remote_ipaddr, remote_port);
1024 
1025 		nc = channel_new("accepted x11 socket",
1026 		    SSH_CHANNEL_OPENING, newsock, newsock, -1,
1027 		    c->local_window_max, c->local_maxpacket,
1028 		    0, xstrdup(buf), 1);
1029 		if (nc == NULL) {
1030 			close(newsock);
1031 			xfree(remote_ipaddr);
1032 			return;
1033 		}
1034 		if (compat20) {
1035 			packet_start(SSH2_MSG_CHANNEL_OPEN);
1036 			packet_put_cstring("x11");
1037 			packet_put_int(nc->self);
1038 			packet_put_int(nc->local_window_max);
1039 			packet_put_int(nc->local_maxpacket);
1040 			/* originator ipaddr and port */
1041 			packet_put_cstring(remote_ipaddr);
1042 			if (datafellows & SSH_BUG_X11FWD) {
1043 				debug("ssh2 x11 bug compat mode");
1044 			} else {
1045 				packet_put_int(remote_port);
1046 			}
1047 			packet_send();
1048 		} else {
1049 			packet_start(SSH_SMSG_X11_OPEN);
1050 			packet_put_int(nc->self);
1051 			if (packet_get_protocol_flags() &
1052 			    SSH_PROTOFLAG_HOST_IN_FWD_OPEN)
1053 				packet_put_cstring(buf);
1054 			packet_send();
1055 		}
1056 		xfree(remote_ipaddr);
1057 	}
1058 }
1059 
1060 static void
1061 port_open_helper(Channel *c, char *rtype)
1062 {
1063 	int direct;
1064 	char buf[1024];
1065 	char *remote_ipaddr = get_peer_ipaddr(c->sock);
1066 	u_short remote_port = get_peer_port(c->sock);
1067 
1068 	direct = (strcmp(rtype, "direct-tcpip") == 0);
1069 
1070 	snprintf(buf, sizeof buf,
1071 	    "%s: listening port %d for %.100s port %d, "
1072 	    "connect from %.200s port %d",
1073 	    rtype, c->listening_port, c->path, c->host_port,
1074 	    remote_ipaddr, remote_port);
1075 
1076 	xfree(c->remote_name);
1077 	c->remote_name = xstrdup(buf);
1078 
1079 	if (compat20) {
1080 		packet_start(SSH2_MSG_CHANNEL_OPEN);
1081 		packet_put_cstring(rtype);
1082 		packet_put_int(c->self);
1083 		packet_put_int(c->local_window_max);
1084 		packet_put_int(c->local_maxpacket);
1085 		if (direct) {
1086 			/* target host, port */
1087 			packet_put_cstring(c->path);
1088 			packet_put_int(c->host_port);
1089 		} else {
1090 			/* listen address, port */
1091 			packet_put_cstring(c->path);
1092 			packet_put_int(c->listening_port);
1093 		}
1094 		/* originator host and port */
1095 		packet_put_cstring(remote_ipaddr);
1096 		packet_put_int(remote_port);
1097 		packet_send();
1098 	} else {
1099 		packet_start(SSH_MSG_PORT_OPEN);
1100 		packet_put_int(c->self);
1101 		packet_put_cstring(c->path);
1102 		packet_put_int(c->host_port);
1103 		if (packet_get_protocol_flags() &
1104 		    SSH_PROTOFLAG_HOST_IN_FWD_OPEN)
1105 			packet_put_cstring(c->remote_name);
1106 		packet_send();
1107 	}
1108 	xfree(remote_ipaddr);
1109 }
1110 
1111 /*
1112  * This socket is listening for connections to a forwarded TCP/IP port.
1113  */
1114 static void
1115 channel_post_port_listener(Channel *c, fd_set * readset, fd_set * writeset)
1116 {
1117 	Channel *nc;
1118 	struct sockaddr addr;
1119 	int newsock, nextstate;
1120 	socklen_t addrlen;
1121 	char *rtype;
1122 
1123 	if (FD_ISSET(c->sock, readset)) {
1124 		debug("Connection to port %d forwarding "
1125 		    "to %.100s port %d requested.",
1126 		    c->listening_port, c->path, c->host_port);
1127 
1128 		if (c->type == SSH_CHANNEL_RPORT_LISTENER) {
1129 			nextstate = SSH_CHANNEL_OPENING;
1130 			rtype = "forwarded-tcpip";
1131 		} else {
1132 			if (c->host_port == 0) {
1133 				nextstate = SSH_CHANNEL_DYNAMIC;
1134 				rtype = "dynamic-tcpip";
1135 			} else {
1136 				nextstate = SSH_CHANNEL_OPENING;
1137 				rtype = "direct-tcpip";
1138 			}
1139 		}
1140 
1141 		addrlen = sizeof(addr);
1142 		newsock = accept(c->sock, &addr, &addrlen);
1143 		if (newsock < 0) {
1144 			error("accept: %.100s", strerror(errno));
1145 			return;
1146 		}
1147 		nc = channel_new(rtype,
1148 		    nextstate, newsock, newsock, -1,
1149 		    c->local_window_max, c->local_maxpacket,
1150 		    0, xstrdup(rtype), 1);
1151 		if (nc == NULL) {
1152 			error("channel_post_port_listener: no new channel:");
1153 			close(newsock);
1154 			return;
1155 		}
1156 		nc->listening_port = c->listening_port;
1157 		nc->host_port = c->host_port;
1158 		strlcpy(nc->path, c->path, sizeof(nc->path));
1159 
1160 		if (nextstate == SSH_CHANNEL_DYNAMIC) {
1161 			/*
1162 			 * do not call the channel_post handler until
1163 			 * this flag has been reset by a pre-handler.
1164 			 * otherwise the FD_ISSET calls might overflow
1165 			 */
1166 			nc->delayed = 1;
1167 		} else {
1168 			port_open_helper(nc, rtype);
1169 		}
1170 	}
1171 }
1172 
1173 /*
1174  * This is the authentication agent socket listening for connections from
1175  * clients.
1176  */
1177 static void
1178 channel_post_auth_listener(Channel *c, fd_set * readset, fd_set * writeset)
1179 {
1180 	Channel *nc;
1181 	char *name;
1182 	int newsock;
1183 	struct sockaddr addr;
1184 	socklen_t addrlen;
1185 
1186 	if (FD_ISSET(c->sock, readset)) {
1187 		addrlen = sizeof(addr);
1188 		newsock = accept(c->sock, &addr, &addrlen);
1189 		if (newsock < 0) {
1190 			error("accept from auth socket: %.100s", strerror(errno));
1191 			return;
1192 		}
1193 		name = xstrdup("accepted auth socket");
1194 		nc = channel_new("accepted auth socket",
1195 		    SSH_CHANNEL_OPENING, newsock, newsock, -1,
1196 		    c->local_window_max, c->local_maxpacket,
1197 		    0, name, 1);
1198 		if (nc == NULL) {
1199 			error("channel_post_auth_listener: channel_new failed");
1200 			xfree(name);
1201 			close(newsock);
1202 		}
1203 		if (compat20) {
1204 			packet_start(SSH2_MSG_CHANNEL_OPEN);
1205 			packet_put_cstring("auth-agent@openssh.com");
1206 			packet_put_int(nc->self);
1207 			packet_put_int(c->local_window_max);
1208 			packet_put_int(c->local_maxpacket);
1209 		} else {
1210 			packet_start(SSH_SMSG_AGENT_OPEN);
1211 			packet_put_int(nc->self);
1212 		}
1213 		packet_send();
1214 	}
1215 }
1216 
1217 static void
1218 channel_post_connecting(Channel *c, fd_set * readset, fd_set * writeset)
1219 {
1220 	int err = 0;
1221 	socklen_t sz = sizeof(err);
1222 
1223 	if (FD_ISSET(c->sock, writeset)) {
1224 		if (getsockopt(c->sock, SOL_SOCKET, SO_ERROR, (char *)&err,
1225 		    &sz) < 0) {
1226 			err = errno;
1227 			error("getsockopt SO_ERROR failed");
1228 		}
1229 		if (err == 0) {
1230 			debug("channel %d: connected", c->self);
1231 			c->type = SSH_CHANNEL_OPEN;
1232 			if (compat20) {
1233 				packet_start(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION);
1234 				packet_put_int(c->remote_id);
1235 				packet_put_int(c->self);
1236 				packet_put_int(c->local_window);
1237 				packet_put_int(c->local_maxpacket);
1238 			} else {
1239 				packet_start(SSH_MSG_CHANNEL_OPEN_CONFIRMATION);
1240 				packet_put_int(c->remote_id);
1241 				packet_put_int(c->self);
1242 			}
1243 		} else {
1244 			debug("channel %d: not connected: %s",
1245 			    c->self, strerror(err));
1246 			if (compat20) {
1247 				packet_start(SSH2_MSG_CHANNEL_OPEN_FAILURE);
1248 				packet_put_int(c->remote_id);
1249 				packet_put_int(SSH2_OPEN_CONNECT_FAILED);
1250 				if (!(datafellows & SSH_BUG_OPENFAILURE)) {
1251 					packet_put_cstring(strerror(err));
1252 					packet_put_cstring("");
1253 				}
1254 			} else {
1255 				packet_start(SSH_MSG_CHANNEL_OPEN_FAILURE);
1256 				packet_put_int(c->remote_id);
1257 			}
1258 			chan_mark_dead(c);
1259 		}
1260 		packet_send();
1261 	}
1262 }
1263 
1264 static int
1265 channel_handle_rfd(Channel *c, fd_set * readset, fd_set * writeset)
1266 {
1267 	char buf[16*1024];
1268 	int len;
1269 
1270 	if (c->rfd != -1 &&
1271 	    FD_ISSET(c->rfd, readset)) {
1272 		len = read(c->rfd, buf, sizeof(buf));
1273 		if (len < 0 && (errno == EINTR || errno == EAGAIN))
1274 			return 1;
1275 		if (len <= 0) {
1276 			debug("channel %d: read<=0 rfd %d len %d",
1277 			    c->self, c->rfd, len);
1278 			if (c->type != SSH_CHANNEL_OPEN) {
1279 				debug("channel %d: not open", c->self);
1280 				chan_mark_dead(c);
1281 				return -1;
1282 			} else if (compat13) {
1283 				buffer_consume(&c->output, buffer_len(&c->output));
1284 				c->type = SSH_CHANNEL_INPUT_DRAINING;
1285 				debug("channel %d: input draining.", c->self);
1286 			} else {
1287 				chan_read_failed(c);
1288 			}
1289 			return -1;
1290 		}
1291 		if (c->input_filter != NULL) {
1292 			if (c->input_filter(c, buf, len) == -1) {
1293 				debug("channel %d: filter stops", c->self);
1294 				chan_read_failed(c);
1295 			}
1296 		} else {
1297 			buffer_append(&c->input, buf, len);
1298 		}
1299 	}
1300 	return 1;
1301 }
1302 static int
1303 channel_handle_wfd(Channel *c, fd_set * readset, fd_set * writeset)
1304 {
1305 	struct termios tio;
1306 	u_char *data;
1307 	u_int dlen;
1308 	int len;
1309 
1310 	/* Send buffered output data to the socket. */
1311 	if (c->wfd != -1 &&
1312 	    FD_ISSET(c->wfd, writeset) &&
1313 	    buffer_len(&c->output) > 0) {
1314 		data = buffer_ptr(&c->output);
1315 		dlen = buffer_len(&c->output);
1316 		len = write(c->wfd, data, dlen);
1317 		if (len < 0 && (errno == EINTR || errno == EAGAIN))
1318 			return 1;
1319 		if (len <= 0) {
1320 			if (c->type != SSH_CHANNEL_OPEN) {
1321 				debug("channel %d: not open", c->self);
1322 				chan_mark_dead(c);
1323 				return -1;
1324 			} else if (compat13) {
1325 				buffer_consume(&c->output, buffer_len(&c->output));
1326 				debug("channel %d: input draining.", c->self);
1327 				c->type = SSH_CHANNEL_INPUT_DRAINING;
1328 			} else {
1329 				chan_write_failed(c);
1330 			}
1331 			return -1;
1332 		}
1333 		if (compat20 && c->isatty && dlen >= 1 && data[0] != '\r') {
1334 			if (tcgetattr(c->wfd, &tio) == 0 &&
1335 			    !(tio.c_lflag & ECHO) && (tio.c_lflag & ICANON)) {
1336 				/*
1337 				 * Simulate echo to reduce the impact of
1338 				 * traffic analysis. We need to match the
1339 				 * size of a SSH2_MSG_CHANNEL_DATA message
1340 				 * (4 byte channel id + data)
1341 				 */
1342 				packet_send_ignore(4 + len);
1343 				packet_send();
1344 			}
1345 		}
1346 		buffer_consume(&c->output, len);
1347 		if (compat20 && len > 0) {
1348 			c->local_consumed += len;
1349 		}
1350 	}
1351 	return 1;
1352 }
1353 static int
1354 channel_handle_efd(Channel *c, fd_set * readset, fd_set * writeset)
1355 {
1356 	char buf[16*1024];
1357 	int len;
1358 
1359 /** XXX handle drain efd, too */
1360 	if (c->efd != -1) {
1361 		if (c->extended_usage == CHAN_EXTENDED_WRITE &&
1362 		    FD_ISSET(c->efd, writeset) &&
1363 		    buffer_len(&c->extended) > 0) {
1364 			len = write(c->efd, buffer_ptr(&c->extended),
1365 			    buffer_len(&c->extended));
1366 			debug2("channel %d: written %d to efd %d",
1367 			    c->self, len, c->efd);
1368 			if (len < 0 && (errno == EINTR || errno == EAGAIN))
1369 				return 1;
1370 			if (len <= 0) {
1371 				debug2("channel %d: closing write-efd %d",
1372 				    c->self, c->efd);
1373 				channel_close_fd(&c->efd);
1374 			} else {
1375 				buffer_consume(&c->extended, len);
1376 				c->local_consumed += len;
1377 			}
1378 		} else if (c->extended_usage == CHAN_EXTENDED_READ &&
1379 		    FD_ISSET(c->efd, readset)) {
1380 			len = read(c->efd, buf, sizeof(buf));
1381 			debug2("channel %d: read %d from efd %d",
1382 			    c->self, len, c->efd);
1383 			if (len < 0 && (errno == EINTR || errno == EAGAIN))
1384 				return 1;
1385 			if (len <= 0) {
1386 				debug2("channel %d: closing read-efd %d",
1387 				    c->self, c->efd);
1388 				channel_close_fd(&c->efd);
1389 			} else {
1390 				buffer_append(&c->extended, buf, len);
1391 			}
1392 		}
1393 	}
1394 	return 1;
1395 }
1396 static int
1397 channel_check_window(Channel *c)
1398 {
1399 	if (c->type == SSH_CHANNEL_OPEN &&
1400 	    !(c->flags & (CHAN_CLOSE_SENT|CHAN_CLOSE_RCVD)) &&
1401 	    c->local_window < c->local_window_max/2 &&
1402 	    c->local_consumed > 0) {
1403 		packet_start(SSH2_MSG_CHANNEL_WINDOW_ADJUST);
1404 		packet_put_int(c->remote_id);
1405 		packet_put_int(c->local_consumed);
1406 		packet_send();
1407 		debug2("channel %d: window %d sent adjust %d",
1408 		    c->self, c->local_window,
1409 		    c->local_consumed);
1410 		c->local_window += c->local_consumed;
1411 		c->local_consumed = 0;
1412 	}
1413 	return 1;
1414 }
1415 
1416 static void
1417 channel_post_open_1(Channel *c, fd_set * readset, fd_set * writeset)
1418 {
1419 	if (c->delayed)
1420 		return;
1421 	channel_handle_rfd(c, readset, writeset);
1422 	channel_handle_wfd(c, readset, writeset);
1423 }
1424 
1425 static void
1426 channel_post_open_2(Channel *c, fd_set * readset, fd_set * writeset)
1427 {
1428 	if (c->delayed)
1429 		return;
1430 	channel_handle_rfd(c, readset, writeset);
1431 	channel_handle_wfd(c, readset, writeset);
1432 	channel_handle_efd(c, readset, writeset);
1433 
1434 	channel_check_window(c);
1435 }
1436 
1437 static void
1438 channel_post_output_drain_13(Channel *c, fd_set * readset, fd_set * writeset)
1439 {
1440 	int len;
1441 	/* Send buffered output data to the socket. */
1442 	if (FD_ISSET(c->sock, writeset) && buffer_len(&c->output) > 0) {
1443 		len = write(c->sock, buffer_ptr(&c->output),
1444 			    buffer_len(&c->output));
1445 		if (len <= 0)
1446 			buffer_consume(&c->output, buffer_len(&c->output));
1447 		else
1448 			buffer_consume(&c->output, len);
1449 	}
1450 }
1451 
1452 static void
1453 channel_handler_init_20(void)
1454 {
1455 	channel_pre[SSH_CHANNEL_OPEN] =			&channel_pre_open_20;
1456 	channel_pre[SSH_CHANNEL_X11_OPEN] =		&channel_pre_x11_open;
1457 	channel_pre[SSH_CHANNEL_PORT_LISTENER] =	&channel_pre_listener;
1458 	channel_pre[SSH_CHANNEL_RPORT_LISTENER] =	&channel_pre_listener;
1459 	channel_pre[SSH_CHANNEL_X11_LISTENER] =		&channel_pre_listener;
1460 	channel_pre[SSH_CHANNEL_AUTH_SOCKET] =		&channel_pre_listener;
1461 	channel_pre[SSH_CHANNEL_CONNECTING] =		&channel_pre_connecting;
1462 	channel_pre[SSH_CHANNEL_DYNAMIC] =		&channel_pre_dynamic;
1463 
1464 	channel_post[SSH_CHANNEL_OPEN] =		&channel_post_open_2;
1465 	channel_post[SSH_CHANNEL_PORT_LISTENER] =	&channel_post_port_listener;
1466 	channel_post[SSH_CHANNEL_RPORT_LISTENER] =	&channel_post_port_listener;
1467 	channel_post[SSH_CHANNEL_X11_LISTENER] =	&channel_post_x11_listener;
1468 	channel_post[SSH_CHANNEL_AUTH_SOCKET] =		&channel_post_auth_listener;
1469 	channel_post[SSH_CHANNEL_CONNECTING] =		&channel_post_connecting;
1470 	channel_post[SSH_CHANNEL_DYNAMIC] =		&channel_post_open_2;
1471 }
1472 
1473 static void
1474 channel_handler_init_13(void)
1475 {
1476 	channel_pre[SSH_CHANNEL_OPEN] =			&channel_pre_open_13;
1477 	channel_pre[SSH_CHANNEL_X11_OPEN] =		&channel_pre_x11_open_13;
1478 	channel_pre[SSH_CHANNEL_X11_LISTENER] =		&channel_pre_listener;
1479 	channel_pre[SSH_CHANNEL_PORT_LISTENER] =	&channel_pre_listener;
1480 	channel_pre[SSH_CHANNEL_AUTH_SOCKET] =		&channel_pre_listener;
1481 	channel_pre[SSH_CHANNEL_INPUT_DRAINING] =	&channel_pre_input_draining;
1482 	channel_pre[SSH_CHANNEL_OUTPUT_DRAINING] =	&channel_pre_output_draining;
1483 	channel_pre[SSH_CHANNEL_CONNECTING] =		&channel_pre_connecting;
1484 	channel_pre[SSH_CHANNEL_DYNAMIC] =		&channel_pre_dynamic;
1485 
1486 	channel_post[SSH_CHANNEL_OPEN] =		&channel_post_open_1;
1487 	channel_post[SSH_CHANNEL_X11_LISTENER] =	&channel_post_x11_listener;
1488 	channel_post[SSH_CHANNEL_PORT_LISTENER] =	&channel_post_port_listener;
1489 	channel_post[SSH_CHANNEL_AUTH_SOCKET] =		&channel_post_auth_listener;
1490 	channel_post[SSH_CHANNEL_OUTPUT_DRAINING] =	&channel_post_output_drain_13;
1491 	channel_post[SSH_CHANNEL_CONNECTING] =		&channel_post_connecting;
1492 	channel_post[SSH_CHANNEL_DYNAMIC] =		&channel_post_open_1;
1493 }
1494 
1495 static void
1496 channel_handler_init_15(void)
1497 {
1498 	channel_pre[SSH_CHANNEL_OPEN] =			&channel_pre_open_15;
1499 	channel_pre[SSH_CHANNEL_X11_OPEN] =		&channel_pre_x11_open;
1500 	channel_pre[SSH_CHANNEL_X11_LISTENER] =		&channel_pre_listener;
1501 	channel_pre[SSH_CHANNEL_PORT_LISTENER] =	&channel_pre_listener;
1502 	channel_pre[SSH_CHANNEL_AUTH_SOCKET] =		&channel_pre_listener;
1503 	channel_pre[SSH_CHANNEL_CONNECTING] =		&channel_pre_connecting;
1504 	channel_pre[SSH_CHANNEL_DYNAMIC] =		&channel_pre_dynamic;
1505 
1506 	channel_post[SSH_CHANNEL_X11_LISTENER] =	&channel_post_x11_listener;
1507 	channel_post[SSH_CHANNEL_PORT_LISTENER] =	&channel_post_port_listener;
1508 	channel_post[SSH_CHANNEL_AUTH_SOCKET] =		&channel_post_auth_listener;
1509 	channel_post[SSH_CHANNEL_OPEN] =		&channel_post_open_1;
1510 	channel_post[SSH_CHANNEL_CONNECTING] =		&channel_post_connecting;
1511 	channel_post[SSH_CHANNEL_DYNAMIC] =		&channel_post_open_1;
1512 }
1513 
1514 static void
1515 channel_handler_init(void)
1516 {
1517 	int i;
1518 	for (i = 0; i < SSH_CHANNEL_MAX_TYPE; i++) {
1519 		channel_pre[i] = NULL;
1520 		channel_post[i] = NULL;
1521 	}
1522 	if (compat20)
1523 		channel_handler_init_20();
1524 	else if (compat13)
1525 		channel_handler_init_13();
1526 	else
1527 		channel_handler_init_15();
1528 }
1529 
1530 /* gc dead channels */
1531 static void
1532 channel_garbage_collect(Channel *c)
1533 {
1534 	if (c == NULL)
1535 		return;
1536 	if (c->detach_user != NULL) {
1537 		if (!chan_is_dead(c, 0))
1538 			return;
1539 		debug("channel %d: gc: notify user", c->self);
1540 		c->detach_user(c->self, NULL);
1541 		/* if we still have a callback */
1542 		if (c->detach_user != NULL)
1543 			return;
1544 		debug("channel %d: gc: user detached", c->self);
1545 	}
1546 	if (!chan_is_dead(c, 1))
1547 		return;
1548 	debug("channel %d: garbage collecting", c->self);
1549 	channel_free(c);
1550 }
1551 
1552 static void
1553 channel_handler(chan_fn *ftab[], fd_set * readset, fd_set * writeset)
1554 {
1555 	static int did_init = 0;
1556 	int i;
1557 	Channel *c;
1558 
1559 	if (!did_init) {
1560 		channel_handler_init();
1561 		did_init = 1;
1562 	}
1563 	for (i = 0; i < channels_alloc; i++) {
1564 		c = channels[i];
1565 		if (c == NULL)
1566 			continue;
1567 		if (ftab[c->type] != NULL)
1568 			(*ftab[c->type])(c, readset, writeset);
1569 		channel_garbage_collect(c);
1570 	}
1571 }
1572 
1573 /*
1574  * Allocate/update select bitmasks and add any bits relevant to channels in
1575  * select bitmasks.
1576  */
1577 void
1578 channel_prepare_select(fd_set **readsetp, fd_set **writesetp, int *maxfdp,
1579     int *nallocp, int rekeying)
1580 {
1581 	int n;
1582 	u_int sz;
1583 
1584 	n = MAX(*maxfdp, channel_max_fd);
1585 
1586 	sz = howmany(n+1, NFDBITS) * sizeof(fd_mask);
1587 	/* perhaps check sz < nalloc/2 and shrink? */
1588 	if (*readsetp == NULL || sz > *nallocp) {
1589 		*readsetp = xrealloc(*readsetp, sz);
1590 		*writesetp = xrealloc(*writesetp, sz);
1591 		*nallocp = sz;
1592 	}
1593 	*maxfdp = n;
1594 	memset(*readsetp, 0, sz);
1595 	memset(*writesetp, 0, sz);
1596 
1597 	if (!rekeying)
1598 		channel_handler(channel_pre, *readsetp, *writesetp);
1599 }
1600 
1601 /*
1602  * After select, perform any appropriate operations for channels which have
1603  * events pending.
1604  */
1605 void
1606 channel_after_select(fd_set * readset, fd_set * writeset)
1607 {
1608 	channel_handler(channel_post, readset, writeset);
1609 }
1610 
1611 
1612 /* If there is data to send to the connection, enqueue some of it now. */
1613 
1614 void
1615 channel_output_poll(void)
1616 {
1617 	int len, i;
1618 	Channel *c;
1619 
1620 	for (i = 0; i < channels_alloc; i++) {
1621 		c = channels[i];
1622 		if (c == NULL)
1623 			continue;
1624 
1625 		/*
1626 		 * We are only interested in channels that can have buffered
1627 		 * incoming data.
1628 		 */
1629 		if (compat13) {
1630 			if (c->type != SSH_CHANNEL_OPEN &&
1631 			    c->type != SSH_CHANNEL_INPUT_DRAINING)
1632 				continue;
1633 		} else {
1634 			if (c->type != SSH_CHANNEL_OPEN)
1635 				continue;
1636 		}
1637 		if (compat20 &&
1638 		    (c->flags & (CHAN_CLOSE_SENT|CHAN_CLOSE_RCVD))) {
1639 			/* XXX is this true? */
1640 			debug3("channel %d: will not send data after close", c->self);
1641 			continue;
1642 		}
1643 
1644 		/* Get the amount of buffered data for this channel. */
1645 		if ((c->istate == CHAN_INPUT_OPEN ||
1646 		    c->istate == CHAN_INPUT_WAIT_DRAIN) &&
1647 		    (len = buffer_len(&c->input)) > 0) {
1648 			/*
1649 			 * Send some data for the other side over the secure
1650 			 * connection.
1651 			 */
1652 			if (compat20) {
1653 				if (len > c->remote_window)
1654 					len = c->remote_window;
1655 				if (len > c->remote_maxpacket)
1656 					len = c->remote_maxpacket;
1657 			} else {
1658 				if (packet_is_interactive()) {
1659 					if (len > 1024)
1660 						len = 512;
1661 				} else {
1662 					/* Keep the packets at reasonable size. */
1663 					if (len > packet_get_maxsize()/2)
1664 						len = packet_get_maxsize()/2;
1665 				}
1666 			}
1667 			if (len > 0) {
1668 				packet_start(compat20 ?
1669 				    SSH2_MSG_CHANNEL_DATA : SSH_MSG_CHANNEL_DATA);
1670 				packet_put_int(c->remote_id);
1671 				packet_put_string(buffer_ptr(&c->input), len);
1672 				packet_send();
1673 				buffer_consume(&c->input, len);
1674 				c->remote_window -= len;
1675 			}
1676 		} else if (c->istate == CHAN_INPUT_WAIT_DRAIN) {
1677 			if (compat13)
1678 				fatal("cannot happen: istate == INPUT_WAIT_DRAIN for proto 1.3");
1679 			/*
1680 			 * input-buffer is empty and read-socket shutdown:
1681 			 * tell peer, that we will not send more data: send IEOF
1682 			 */
1683 			chan_ibuf_empty(c);
1684 		}
1685 		/* Send extended data, i.e. stderr */
1686 		if (compat20 &&
1687 		    c->remote_window > 0 &&
1688 		    (len = buffer_len(&c->extended)) > 0 &&
1689 		    c->extended_usage == CHAN_EXTENDED_READ) {
1690 			debug2("channel %d: rwin %d elen %d euse %d",
1691 			    c->self, c->remote_window, buffer_len(&c->extended),
1692 			    c->extended_usage);
1693 			if (len > c->remote_window)
1694 				len = c->remote_window;
1695 			if (len > c->remote_maxpacket)
1696 				len = c->remote_maxpacket;
1697 			packet_start(SSH2_MSG_CHANNEL_EXTENDED_DATA);
1698 			packet_put_int(c->remote_id);
1699 			packet_put_int(SSH2_EXTENDED_DATA_STDERR);
1700 			packet_put_string(buffer_ptr(&c->extended), len);
1701 			packet_send();
1702 			buffer_consume(&c->extended, len);
1703 			c->remote_window -= len;
1704 			debug2("channel %d: sent ext data %d", c->self, len);
1705 		}
1706 	}
1707 }
1708 
1709 
1710 /* -- protocol input */
1711 
1712 void
1713 channel_input_data(int type, u_int32_t seq, void *ctxt)
1714 {
1715 	int id;
1716 	char *data;
1717 	u_int data_len;
1718 	Channel *c;
1719 
1720 	/* Get the channel number and verify it. */
1721 	id = packet_get_int();
1722 	c = channel_lookup(id);
1723 	if (c == NULL)
1724 		packet_disconnect("Received data for nonexistent channel %d.", id);
1725 
1726 	/* Ignore any data for non-open channels (might happen on close) */
1727 	if (c->type != SSH_CHANNEL_OPEN &&
1728 	    c->type != SSH_CHANNEL_X11_OPEN)
1729 		return;
1730 
1731 	/* same for protocol 1.5 if output end is no longer open */
1732 	if (!compat13 && c->ostate != CHAN_OUTPUT_OPEN)
1733 		return;
1734 
1735 	/* Get the data. */
1736 	data = packet_get_string(&data_len);
1737 
1738 	if (compat20) {
1739 		if (data_len > c->local_maxpacket) {
1740 			log("channel %d: rcvd big packet %d, maxpack %d",
1741 			    c->self, data_len, c->local_maxpacket);
1742 		}
1743 		if (data_len > c->local_window) {
1744 			log("channel %d: rcvd too much data %d, win %d",
1745 			    c->self, data_len, c->local_window);
1746 			xfree(data);
1747 			return;
1748 		}
1749 		c->local_window -= data_len;
1750 	}
1751 	packet_check_eom();
1752 	buffer_append(&c->output, data, data_len);
1753 	xfree(data);
1754 }
1755 
1756 void
1757 channel_input_extended_data(int type, u_int32_t seq, void *ctxt)
1758 {
1759 	int id;
1760 	int tcode;
1761 	char *data;
1762 	u_int data_len;
1763 	Channel *c;
1764 
1765 	/* Get the channel number and verify it. */
1766 	id = packet_get_int();
1767 	c = channel_lookup(id);
1768 
1769 	if (c == NULL)
1770 		packet_disconnect("Received extended_data for bad channel %d.", id);
1771 	if (c->type != SSH_CHANNEL_OPEN) {
1772 		log("channel %d: ext data for non open", id);
1773 		return;
1774 	}
1775 	tcode = packet_get_int();
1776 	if (c->efd == -1 ||
1777 	    c->extended_usage != CHAN_EXTENDED_WRITE ||
1778 	    tcode != SSH2_EXTENDED_DATA_STDERR) {
1779 		log("channel %d: bad ext data", c->self);
1780 		return;
1781 	}
1782 	data = packet_get_string(&data_len);
1783 	packet_check_eom();
1784 	if (data_len > c->local_window) {
1785 		log("channel %d: rcvd too much extended_data %d, win %d",
1786 		    c->self, data_len, c->local_window);
1787 		xfree(data);
1788 		return;
1789 	}
1790 	debug2("channel %d: rcvd ext data %d", c->self, data_len);
1791 	c->local_window -= data_len;
1792 	buffer_append(&c->extended, data, data_len);
1793 	xfree(data);
1794 }
1795 
1796 void
1797 channel_input_ieof(int type, u_int32_t seq, void *ctxt)
1798 {
1799 	int id;
1800 	Channel *c;
1801 
1802 	id = packet_get_int();
1803 	packet_check_eom();
1804 	c = channel_lookup(id);
1805 	if (c == NULL)
1806 		packet_disconnect("Received ieof for nonexistent channel %d.", id);
1807 	chan_rcvd_ieof(c);
1808 
1809 	/* XXX force input close */
1810 	if (c->force_drain) {
1811 		debug("channel %d: FORCE input drain", c->self);
1812 		c->istate = CHAN_INPUT_WAIT_DRAIN;
1813 	}
1814 
1815 }
1816 
1817 void
1818 channel_input_close(int type, u_int32_t seq, void *ctxt)
1819 {
1820 	int id;
1821 	Channel *c;
1822 
1823 	id = packet_get_int();
1824 	packet_check_eom();
1825 	c = channel_lookup(id);
1826 	if (c == NULL)
1827 		packet_disconnect("Received close for nonexistent channel %d.", id);
1828 
1829 	/*
1830 	 * Send a confirmation that we have closed the channel and no more
1831 	 * data is coming for it.
1832 	 */
1833 	packet_start(SSH_MSG_CHANNEL_CLOSE_CONFIRMATION);
1834 	packet_put_int(c->remote_id);
1835 	packet_send();
1836 
1837 	/*
1838 	 * If the channel is in closed state, we have sent a close request,
1839 	 * and the other side will eventually respond with a confirmation.
1840 	 * Thus, we cannot free the channel here, because then there would be
1841 	 * no-one to receive the confirmation.  The channel gets freed when
1842 	 * the confirmation arrives.
1843 	 */
1844 	if (c->type != SSH_CHANNEL_CLOSED) {
1845 		/*
1846 		 * Not a closed channel - mark it as draining, which will
1847 		 * cause it to be freed later.
1848 		 */
1849 		buffer_consume(&c->input, buffer_len(&c->input));
1850 		c->type = SSH_CHANNEL_OUTPUT_DRAINING;
1851 	}
1852 }
1853 
1854 /* proto version 1.5 overloads CLOSE_CONFIRMATION with OCLOSE */
1855 void
1856 channel_input_oclose(int type, u_int32_t seq, void *ctxt)
1857 {
1858 	int id = packet_get_int();
1859 	Channel *c = channel_lookup(id);
1860 
1861 	packet_check_eom();
1862 	if (c == NULL)
1863 		packet_disconnect("Received oclose for nonexistent channel %d.", id);
1864 	chan_rcvd_oclose(c);
1865 }
1866 
1867 void
1868 channel_input_close_confirmation(int type, u_int32_t seq, void *ctxt)
1869 {
1870 	int id = packet_get_int();
1871 	Channel *c = channel_lookup(id);
1872 
1873 	packet_check_eom();
1874 	if (c == NULL)
1875 		packet_disconnect("Received close confirmation for "
1876 		    "out-of-range channel %d.", id);
1877 	if (c->type != SSH_CHANNEL_CLOSED)
1878 		packet_disconnect("Received close confirmation for "
1879 		    "non-closed channel %d (type %d).", id, c->type);
1880 	channel_free(c);
1881 }
1882 
1883 void
1884 channel_input_open_confirmation(int type, u_int32_t seq, void *ctxt)
1885 {
1886 	int id, remote_id;
1887 	Channel *c;
1888 
1889 	id = packet_get_int();
1890 	c = channel_lookup(id);
1891 
1892 	if (c==NULL || c->type != SSH_CHANNEL_OPENING)
1893 		packet_disconnect("Received open confirmation for "
1894 		    "non-opening channel %d.", id);
1895 	remote_id = packet_get_int();
1896 	/* Record the remote channel number and mark that the channel is now open. */
1897 	c->remote_id = remote_id;
1898 	c->type = SSH_CHANNEL_OPEN;
1899 
1900 	if (compat20) {
1901 		c->remote_window = packet_get_int();
1902 		c->remote_maxpacket = packet_get_int();
1903 		if (c->cb_fn != NULL && c->cb_event == type) {
1904 			debug2("callback start");
1905 			c->cb_fn(c->self, c->cb_arg);
1906 			debug2("callback done");
1907 		}
1908 		debug("channel %d: open confirm rwindow %d rmax %d", c->self,
1909 		    c->remote_window, c->remote_maxpacket);
1910 	}
1911 	packet_check_eom();
1912 }
1913 
1914 static char *
1915 reason2txt(int reason)
1916 {
1917 	switch (reason) {
1918 	case SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED:
1919 		return "administratively prohibited";
1920 	case SSH2_OPEN_CONNECT_FAILED:
1921 		return "connect failed";
1922 	case SSH2_OPEN_UNKNOWN_CHANNEL_TYPE:
1923 		return "unknown channel type";
1924 	case SSH2_OPEN_RESOURCE_SHORTAGE:
1925 		return "resource shortage";
1926 	}
1927 	return "unknown reason";
1928 }
1929 
1930 void
1931 channel_input_open_failure(int type, u_int32_t seq, void *ctxt)
1932 {
1933 	int id, reason;
1934 	char *msg = NULL, *lang = NULL;
1935 	Channel *c;
1936 
1937 	id = packet_get_int();
1938 	c = channel_lookup(id);
1939 
1940 	if (c==NULL || c->type != SSH_CHANNEL_OPENING)
1941 		packet_disconnect("Received open failure for "
1942 		    "non-opening channel %d.", id);
1943 	if (compat20) {
1944 		reason = packet_get_int();
1945 		if (!(datafellows & SSH_BUG_OPENFAILURE)) {
1946 			msg  = packet_get_string(NULL);
1947 			lang = packet_get_string(NULL);
1948 		}
1949 		log("channel %d: open failed: %s%s%s", id,
1950 		    reason2txt(reason), msg ? ": ": "", msg ? msg : "");
1951 		if (msg != NULL)
1952 			xfree(msg);
1953 		if (lang != NULL)
1954 			xfree(lang);
1955 	}
1956 	packet_check_eom();
1957 	/* Free the channel.  This will also close the socket. */
1958 	channel_free(c);
1959 }
1960 
1961 void
1962 channel_input_channel_request(int type, u_int32_t seq, void *ctxt)
1963 {
1964 	int id;
1965 	Channel *c;
1966 
1967 	id = packet_get_int();
1968 	c = channel_lookup(id);
1969 
1970 	if (c == NULL ||
1971 	    (c->type != SSH_CHANNEL_OPEN && c->type != SSH_CHANNEL_LARVAL))
1972 		packet_disconnect("Received request for "
1973 		    "non-open channel %d.", id);
1974 	if (c->cb_fn != NULL && c->cb_event == type) {
1975 		debug2("callback start");
1976 		c->cb_fn(c->self, c->cb_arg);
1977 		debug2("callback done");
1978 	} else {
1979 		char *service = packet_get_string(NULL);
1980 		debug("channel %d: rcvd request for %s", c->self, service);
1981 		debug("cb_fn %p cb_event %d", c->cb_fn , c->cb_event);
1982 		xfree(service);
1983 	}
1984 }
1985 
1986 void
1987 channel_input_window_adjust(int type, u_int32_t seq, void *ctxt)
1988 {
1989 	Channel *c;
1990 	int id, adjust;
1991 
1992 	if (!compat20)
1993 		return;
1994 
1995 	/* Get the channel number and verify it. */
1996 	id = packet_get_int();
1997 	c = channel_lookup(id);
1998 
1999 	if (c == NULL || c->type != SSH_CHANNEL_OPEN) {
2000 		log("Received window adjust for "
2001 		    "non-open channel %d.", id);
2002 		return;
2003 	}
2004 	adjust = packet_get_int();
2005 	packet_check_eom();
2006 	debug2("channel %d: rcvd adjust %d", id, adjust);
2007 	c->remote_window += adjust;
2008 }
2009 
2010 void
2011 channel_input_port_open(int type, u_int32_t seq, void *ctxt)
2012 {
2013 	Channel *c = NULL;
2014 	u_short host_port;
2015 	char *host, *originator_string;
2016 	int remote_id, sock = -1;
2017 
2018 	remote_id = packet_get_int();
2019 	host = packet_get_string(NULL);
2020 	host_port = packet_get_int();
2021 
2022 	if (packet_get_protocol_flags() & SSH_PROTOFLAG_HOST_IN_FWD_OPEN) {
2023 		originator_string = packet_get_string(NULL);
2024 	} else {
2025 		originator_string = xstrdup("unknown (remote did not supply name)");
2026 	}
2027 	packet_check_eom();
2028 	sock = channel_connect_to(host, host_port);
2029 	if (sock != -1) {
2030 		c = channel_new("connected socket",
2031 		    SSH_CHANNEL_CONNECTING, sock, sock, -1, 0, 0, 0,
2032 		    originator_string, 1);
2033 		if (c == NULL) {
2034 			error("channel_input_port_open: channel_new failed");
2035 			close(sock);
2036 		} else {
2037 			c->remote_id = remote_id;
2038 		}
2039 	}
2040 	if (c == NULL) {
2041 		packet_start(SSH_MSG_CHANNEL_OPEN_FAILURE);
2042 		packet_put_int(remote_id);
2043 		packet_send();
2044 	}
2045 	xfree(host);
2046 }
2047 
2048 
2049 /* -- tcp forwarding */
2050 
2051 void
2052 channel_set_af(int af)
2053 {
2054 	IPv4or6 = af;
2055 }
2056 
2057 /*
2058  * Initiate forwarding of connections to local port "port" through the secure
2059  * channel to host:port from remote side.
2060  */
2061 int
2062 channel_request_local_forwarding(u_short listen_port, const char *host_to_connect,
2063     u_short port_to_connect, int gateway_ports)
2064 {
2065 	return channel_request_forwarding(
2066 	    NULL, listen_port,
2067 	    host_to_connect, port_to_connect,
2068 	    gateway_ports, /*remote_fwd*/ 0);
2069 }
2070 
2071 /*
2072  * If 'remote_fwd' is true we have a '-R style' listener for protocol 2
2073  * (SSH_CHANNEL_RPORT_LISTENER).
2074  */
2075 int
2076 channel_request_forwarding(
2077     const char *listen_address, u_short listen_port,
2078     const char *host_to_connect, u_short port_to_connect,
2079     int gateway_ports, int remote_fwd)
2080 {
2081 	Channel *c;
2082 	int success, sock, on = 1, type;
2083 	struct addrinfo hints, *ai, *aitop;
2084 	char ntop[NI_MAXHOST], strport[NI_MAXSERV];
2085 	const char *host;
2086 	struct linger linger;
2087 
2088 	success = 0;
2089 
2090 	if (remote_fwd) {
2091 		host = listen_address;
2092 		type = SSH_CHANNEL_RPORT_LISTENER;
2093 	} else {
2094 		host = host_to_connect;
2095 		type = SSH_CHANNEL_PORT_LISTENER;
2096 	}
2097 
2098 	if (strlen(host) > SSH_CHANNEL_PATH_LEN - 1) {
2099 		error("Forward host name too long.");
2100 		return success;
2101 	}
2102 
2103 	/* XXX listen_address is currently ignored */
2104 	/*
2105 	 * getaddrinfo returns a loopback address if the hostname is
2106 	 * set to NULL and hints.ai_flags is not AI_PASSIVE
2107 	 */
2108 	memset(&hints, 0, sizeof(hints));
2109 	hints.ai_family = IPv4or6;
2110 	hints.ai_flags = gateway_ports ? AI_PASSIVE : 0;
2111 	hints.ai_socktype = SOCK_STREAM;
2112 	snprintf(strport, sizeof strport, "%d", listen_port);
2113 	if (getaddrinfo(NULL, strport, &hints, &aitop) != 0)
2114 		packet_disconnect("getaddrinfo: fatal error");
2115 
2116 	for (ai = aitop; ai; ai = ai->ai_next) {
2117 		if (ai->ai_family != AF_INET && ai->ai_family != AF_INET6)
2118 			continue;
2119 		if (getnameinfo(ai->ai_addr, ai->ai_addrlen, ntop, sizeof(ntop),
2120 		    strport, sizeof(strport), NI_NUMERICHOST|NI_NUMERICSERV) != 0) {
2121 			error("channel_request_forwarding: getnameinfo failed");
2122 			continue;
2123 		}
2124 		/* Create a port to listen for the host. */
2125 		sock = socket(ai->ai_family, SOCK_STREAM, 0);
2126 		if (sock < 0) {
2127 			/* this is no error since kernel may not support ipv6 */
2128 			verbose("socket: %.100s", strerror(errno));
2129 			continue;
2130 		}
2131 		/*
2132 		 * Set socket options.  We would like the socket to disappear
2133 		 * as soon as it has been closed for whatever reason.
2134 		 */
2135 		setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *)&on, sizeof(on));
2136 		linger.l_onoff = 1;
2137 		linger.l_linger = 5;
2138 		setsockopt(sock, SOL_SOCKET, SO_LINGER, (void *)&linger, sizeof(linger));
2139 		debug("Local forwarding listening on %s port %s.", ntop, strport);
2140 
2141 		/* Bind the socket to the address. */
2142 		if (bind(sock, ai->ai_addr, ai->ai_addrlen) < 0) {
2143 			/* address can be in use ipv6 address is already bound */
2144 			verbose("bind: %.100s", strerror(errno));
2145 			close(sock);
2146 			continue;
2147 		}
2148 		/* Start listening for connections on the socket. */
2149 		if (listen(sock, 5) < 0) {
2150 			error("listen: %.100s", strerror(errno));
2151 			close(sock);
2152 			continue;
2153 		}
2154 		/* Allocate a channel number for the socket. */
2155 		c = channel_new("port listener", type, sock, sock, -1,
2156 		    CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT,
2157 		    0, xstrdup("port listener"), 1);
2158 		if (c == NULL) {
2159 			error("channel_request_forwarding: channel_new failed");
2160 			close(sock);
2161 			continue;
2162 		}
2163 		strlcpy(c->path, host, sizeof(c->path));
2164 		c->host_port = port_to_connect;
2165 		c->listening_port = listen_port;
2166 		success = 1;
2167 	}
2168 	if (success == 0)
2169 		error("channel_request_forwarding: cannot listen to port: %d",
2170 		    listen_port);
2171 	freeaddrinfo(aitop);
2172 	return success;
2173 }
2174 
2175 /*
2176  * Initiate forwarding of connections to port "port" on remote host through
2177  * the secure channel to host:port from local side.
2178  */
2179 
2180 void
2181 channel_request_remote_forwarding(u_short listen_port,
2182     const char *host_to_connect, u_short port_to_connect)
2183 {
2184 	int type, success = 0;
2185 
2186 	/* Record locally that connection to this host/port is permitted. */
2187 	if (num_permitted_opens >= SSH_MAX_FORWARDS_PER_DIRECTION)
2188 		fatal("channel_request_remote_forwarding: too many forwards");
2189 
2190 	/* Send the forward request to the remote side. */
2191 	if (compat20) {
2192 		const char *address_to_bind = "0.0.0.0";
2193 		packet_start(SSH2_MSG_GLOBAL_REQUEST);
2194 		packet_put_cstring("tcpip-forward");
2195 		packet_put_char(0);			/* boolean: want reply */
2196 		packet_put_cstring(address_to_bind);
2197 		packet_put_int(listen_port);
2198 		packet_send();
2199 		packet_write_wait();
2200 		/* Assume that server accepts the request */
2201 		success = 1;
2202 	} else {
2203 		packet_start(SSH_CMSG_PORT_FORWARD_REQUEST);
2204 		packet_put_int(listen_port);
2205 		packet_put_cstring(host_to_connect);
2206 		packet_put_int(port_to_connect);
2207 		packet_send();
2208 		packet_write_wait();
2209 
2210 		/* Wait for response from the remote side. */
2211 		type = packet_read();
2212 		switch (type) {
2213 		case SSH_SMSG_SUCCESS:
2214 			success = 1;
2215 			break;
2216 		case SSH_SMSG_FAILURE:
2217 			log("Warning: Server denied remote port forwarding.");
2218 			break;
2219 		default:
2220 			/* Unknown packet */
2221 			packet_disconnect("Protocol error for port forward request:"
2222 			    "received packet type %d.", type);
2223 		}
2224 	}
2225 	if (success) {
2226 		permitted_opens[num_permitted_opens].host_to_connect = xstrdup(host_to_connect);
2227 		permitted_opens[num_permitted_opens].port_to_connect = port_to_connect;
2228 		permitted_opens[num_permitted_opens].listen_port = listen_port;
2229 		num_permitted_opens++;
2230 	}
2231 }
2232 
2233 /*
2234  * This is called after receiving CHANNEL_FORWARDING_REQUEST.  This initates
2235  * listening for the port, and sends back a success reply (or disconnect
2236  * message if there was an error).  This never returns if there was an error.
2237  */
2238 
2239 void
2240 channel_input_port_forward_request(int is_root, int gateway_ports)
2241 {
2242 	u_short port, host_port;
2243 	char *hostname;
2244 
2245 	/* Get arguments from the packet. */
2246 	port = packet_get_int();
2247 	hostname = packet_get_string(NULL);
2248 	host_port = packet_get_int();
2249 
2250 	/*
2251 	 * Check that an unprivileged user is not trying to forward a
2252 	 * privileged port.
2253 	 */
2254 	if (port < IPPORT_RESERVED && !is_root)
2255 		packet_disconnect("Requested forwarding of port %d but user is not root.",
2256 				  port);
2257 	/* Initiate forwarding */
2258 	channel_request_local_forwarding(port, hostname, host_port, gateway_ports);
2259 
2260 	/* Free the argument string. */
2261 	xfree(hostname);
2262 }
2263 
2264 /*
2265  * Permits opening to any host/port if permitted_opens[] is empty.  This is
2266  * usually called by the server, because the user could connect to any port
2267  * anyway, and the server has no way to know but to trust the client anyway.
2268  */
2269 void
2270 channel_permit_all_opens(void)
2271 {
2272 	if (num_permitted_opens == 0)
2273 		all_opens_permitted = 1;
2274 }
2275 
2276 void
2277 channel_add_permitted_opens(char *host, int port)
2278 {
2279 	if (num_permitted_opens >= SSH_MAX_FORWARDS_PER_DIRECTION)
2280 		fatal("channel_request_remote_forwarding: too many forwards");
2281 	debug("allow port forwarding to host %s port %d", host, port);
2282 
2283 	permitted_opens[num_permitted_opens].host_to_connect = xstrdup(host);
2284 	permitted_opens[num_permitted_opens].port_to_connect = port;
2285 	num_permitted_opens++;
2286 
2287 	all_opens_permitted = 0;
2288 }
2289 
2290 void
2291 channel_clear_permitted_opens(void)
2292 {
2293 	int i;
2294 
2295 	for (i = 0; i < num_permitted_opens; i++)
2296 		xfree(permitted_opens[i].host_to_connect);
2297 	num_permitted_opens = 0;
2298 
2299 }
2300 
2301 
2302 /* return socket to remote host, port */
2303 static int
2304 connect_to(const char *host, u_short port)
2305 {
2306 	struct addrinfo hints, *ai, *aitop;
2307 	char ntop[NI_MAXHOST], strport[NI_MAXSERV];
2308 	int gaierr;
2309 	int sock = -1;
2310 
2311 	memset(&hints, 0, sizeof(hints));
2312 	hints.ai_family = IPv4or6;
2313 	hints.ai_socktype = SOCK_STREAM;
2314 	snprintf(strport, sizeof strport, "%d", port);
2315 	if ((gaierr = getaddrinfo(host, strport, &hints, &aitop)) != 0) {
2316 		error("connect_to %.100s: unknown host (%s)", host,
2317 		    gai_strerror(gaierr));
2318 		return -1;
2319 	}
2320 	for (ai = aitop; ai; ai = ai->ai_next) {
2321 		if (ai->ai_family != AF_INET && ai->ai_family != AF_INET6)
2322 			continue;
2323 		if (getnameinfo(ai->ai_addr, ai->ai_addrlen, ntop, sizeof(ntop),
2324 		    strport, sizeof(strport), NI_NUMERICHOST|NI_NUMERICSERV) != 0) {
2325 			error("connect_to: getnameinfo failed");
2326 			continue;
2327 		}
2328 		sock = socket(ai->ai_family, SOCK_STREAM, 0);
2329 		if (sock < 0) {
2330 			error("socket: %.100s", strerror(errno));
2331 			continue;
2332 		}
2333 		if (fcntl(sock, F_SETFL, O_NONBLOCK) < 0)
2334 			fatal("connect_to: F_SETFL: %s", strerror(errno));
2335 		if (connect(sock, ai->ai_addr, ai->ai_addrlen) < 0 &&
2336 		    errno != EINPROGRESS) {
2337 			error("connect_to %.100s port %s: %.100s", ntop, strport,
2338 			    strerror(errno));
2339 			close(sock);
2340 			continue;	/* fail -- try next */
2341 		}
2342 		break; /* success */
2343 
2344 	}
2345 	freeaddrinfo(aitop);
2346 	if (!ai) {
2347 		error("connect_to %.100s port %d: failed.", host, port);
2348 		return -1;
2349 	}
2350 	/* success */
2351 	return sock;
2352 }
2353 
2354 int
2355 channel_connect_by_listen_address(u_short listen_port)
2356 {
2357 	int i;
2358 
2359 	for (i = 0; i < num_permitted_opens; i++)
2360 		if (permitted_opens[i].listen_port == listen_port)
2361 			return connect_to(
2362 			    permitted_opens[i].host_to_connect,
2363 			    permitted_opens[i].port_to_connect);
2364 	error("WARNING: Server requests forwarding for unknown listen_port %d",
2365 	    listen_port);
2366 	return -1;
2367 }
2368 
2369 /* Check if connecting to that port is permitted and connect. */
2370 int
2371 channel_connect_to(const char *host, u_short port)
2372 {
2373 	int i, permit;
2374 
2375 	permit = all_opens_permitted;
2376 	if (!permit) {
2377 		for (i = 0; i < num_permitted_opens; i++)
2378 			if (permitted_opens[i].port_to_connect == port &&
2379 			    strcmp(permitted_opens[i].host_to_connect, host) == 0)
2380 				permit = 1;
2381 
2382 	}
2383 	if (!permit) {
2384 		log("Received request to connect to host %.100s port %d, "
2385 		    "but the request was denied.", host, port);
2386 		return -1;
2387 	}
2388 	return connect_to(host, port);
2389 }
2390 
2391 /* -- X11 forwarding */
2392 
2393 /*
2394  * Creates an internet domain socket for listening for X11 connections.
2395  * Returns a suitable display number for the DISPLAY variable, or -1 if
2396  * an error occurs.
2397  */
2398 int
2399 x11_create_display_inet(int x11_display_offset, int gateway_ports,
2400     int single_connection)
2401 {
2402 	Channel *nc = NULL;
2403 	int display_number, sock;
2404 	u_short port;
2405 	struct addrinfo hints, *ai, *aitop;
2406 	char strport[NI_MAXSERV];
2407 	int gaierr, n, num_socks = 0, socks[NUM_SOCKS];
2408 
2409 	for (display_number = x11_display_offset;
2410 	    display_number < MAX_DISPLAYS;
2411 	    display_number++) {
2412 		port = 6000 + display_number;
2413 		memset(&hints, 0, sizeof(hints));
2414 		hints.ai_family = IPv4or6;
2415 		hints.ai_flags = gateway_ports ? AI_PASSIVE : 0;
2416 		hints.ai_socktype = SOCK_STREAM;
2417 		snprintf(strport, sizeof strport, "%d", port);
2418 		if ((gaierr = getaddrinfo(NULL, strport, &hints, &aitop)) != 0) {
2419 			error("getaddrinfo: %.100s", gai_strerror(gaierr));
2420 			return -1;
2421 		}
2422 		for (ai = aitop; ai; ai = ai->ai_next) {
2423 			if (ai->ai_family != AF_INET && ai->ai_family != AF_INET6)
2424 				continue;
2425 			sock = socket(ai->ai_family, SOCK_STREAM, 0);
2426 			if (sock < 0) {
2427 				error("socket: %.100s", strerror(errno));
2428 				return -1;
2429 			}
2430 			if (bind(sock, ai->ai_addr, ai->ai_addrlen) < 0) {
2431 				debug("bind port %d: %.100s", port, strerror(errno));
2432 				close(sock);
2433 				for (n = 0; n < num_socks; n++) {
2434 					close(socks[n]);
2435 				}
2436 				num_socks = 0;
2437 				break;
2438 			}
2439 			socks[num_socks++] = sock;
2440 			if (num_socks == NUM_SOCKS)
2441 				break;
2442 		}
2443 		freeaddrinfo(aitop);
2444 		if (num_socks > 0)
2445 			break;
2446 	}
2447 	if (display_number >= MAX_DISPLAYS) {
2448 		error("Failed to allocate internet-domain X11 display socket.");
2449 		return -1;
2450 	}
2451 	/* Start listening for connections on the socket. */
2452 	for (n = 0; n < num_socks; n++) {
2453 		sock = socks[n];
2454 		if (listen(sock, 5) < 0) {
2455 			error("listen: %.100s", strerror(errno));
2456 			close(sock);
2457 			return -1;
2458 		}
2459 	}
2460 
2461 	/* Allocate a channel for each socket. */
2462 	for (n = 0; n < num_socks; n++) {
2463 		sock = socks[n];
2464 		nc = channel_new("x11 listener",
2465 		    SSH_CHANNEL_X11_LISTENER, sock, sock, -1,
2466 		    CHAN_X11_WINDOW_DEFAULT, CHAN_X11_PACKET_DEFAULT,
2467 		    0, xstrdup("X11 inet listener"), 1);
2468 		if (nc != NULL)
2469 			nc->single_connection = single_connection;
2470 	}
2471 
2472 	/* Return the display number for the DISPLAY environment variable. */
2473 	return display_number;
2474 }
2475 
2476 static int
2477 connect_local_xsocket(u_int dnr)
2478 {
2479 	int sock;
2480 	struct sockaddr_un addr;
2481 
2482 	sock = socket(AF_UNIX, SOCK_STREAM, 0);
2483 	if (sock < 0)
2484 		error("socket: %.100s", strerror(errno));
2485 	memset(&addr, 0, sizeof(addr));
2486 	addr.sun_family = AF_UNIX;
2487 	snprintf(addr.sun_path, sizeof addr.sun_path, _PATH_UNIX_X, dnr);
2488 	if (connect(sock, (struct sockaddr *) & addr, sizeof(addr)) == 0)
2489 		return sock;
2490 	close(sock);
2491 	error("connect %.100s: %.100s", addr.sun_path, strerror(errno));
2492 	return -1;
2493 }
2494 
2495 int
2496 x11_connect_display(void)
2497 {
2498 	int display_number, sock = 0, on = 1;
2499 	const char *display;
2500 	char buf[1024], *cp;
2501 	struct addrinfo hints, *ai, *aitop;
2502 	char strport[NI_MAXSERV];
2503 	int gaierr;
2504 
2505 	/* Try to open a socket for the local X server. */
2506 	display = getenv("DISPLAY");
2507 	if (!display) {
2508 		error("DISPLAY not set.");
2509 		return -1;
2510 	}
2511 	/*
2512 	 * Now we decode the value of the DISPLAY variable and make a
2513 	 * connection to the real X server.
2514 	 */
2515 
2516 	/*
2517 	 * Check if it is a unix domain socket.  Unix domain displays are in
2518 	 * one of the following formats: unix:d[.s], :d[.s], ::d[.s]
2519 	 */
2520 	if (strncmp(display, "unix:", 5) == 0 ||
2521 	    display[0] == ':') {
2522 		/* Connect to the unix domain socket. */
2523 		if (sscanf(strrchr(display, ':') + 1, "%d", &display_number) != 1) {
2524 			error("Could not parse display number from DISPLAY: %.100s",
2525 			    display);
2526 			return -1;
2527 		}
2528 		/* Create a socket. */
2529 		sock = connect_local_xsocket(display_number);
2530 		if (sock < 0)
2531 			return -1;
2532 
2533 		/* OK, we now have a connection to the display. */
2534 		return sock;
2535 	}
2536 	/*
2537 	 * Connect to an inet socket.  The DISPLAY value is supposedly
2538 	 * hostname:d[.s], where hostname may also be numeric IP address.
2539 	 */
2540 	strlcpy(buf, display, sizeof(buf));
2541 	cp = strchr(buf, ':');
2542 	if (!cp) {
2543 		error("Could not find ':' in DISPLAY: %.100s", display);
2544 		return -1;
2545 	}
2546 	*cp = 0;
2547 	/* buf now contains the host name.  But first we parse the display number. */
2548 	if (sscanf(cp + 1, "%d", &display_number) != 1) {
2549 		error("Could not parse display number from DISPLAY: %.100s",
2550 		    display);
2551 		return -1;
2552 	}
2553 
2554 	/* Look up the host address */
2555 	memset(&hints, 0, sizeof(hints));
2556 	hints.ai_family = IPv4or6;
2557 	hints.ai_socktype = SOCK_STREAM;
2558 	snprintf(strport, sizeof strport, "%d", 6000 + display_number);
2559 	if ((gaierr = getaddrinfo(buf, strport, &hints, &aitop)) != 0) {
2560 		error("%.100s: unknown host. (%s)", buf, gai_strerror(gaierr));
2561 		return -1;
2562 	}
2563 	for (ai = aitop; ai; ai = ai->ai_next) {
2564 		/* Create a socket. */
2565 		sock = socket(ai->ai_family, SOCK_STREAM, 0);
2566 		if (sock < 0) {
2567 			debug("socket: %.100s", strerror(errno));
2568 			continue;
2569 		}
2570 		/* Connect it to the display. */
2571 		if (connect(sock, ai->ai_addr, ai->ai_addrlen) < 0) {
2572 			debug("connect %.100s port %d: %.100s", buf,
2573 			    6000 + display_number, strerror(errno));
2574 			close(sock);
2575 			continue;
2576 		}
2577 		/* Success */
2578 		break;
2579 	}
2580 	freeaddrinfo(aitop);
2581 	if (!ai) {
2582 		error("connect %.100s port %d: %.100s", buf, 6000 + display_number,
2583 		    strerror(errno));
2584 		return -1;
2585 	}
2586 	if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &on, sizeof on) == -1)
2587 		error("setsockopt TCP_NODELAY: %.100s", strerror(errno));
2588 	return sock;
2589 }
2590 
2591 /*
2592  * This is called when SSH_SMSG_X11_OPEN is received.  The packet contains
2593  * the remote channel number.  We should do whatever we want, and respond
2594  * with either SSH_MSG_OPEN_CONFIRMATION or SSH_MSG_OPEN_FAILURE.
2595  */
2596 
2597 void
2598 x11_input_open(int type, u_int32_t seq, void *ctxt)
2599 {
2600 	Channel *c = NULL;
2601 	int remote_id, sock = 0;
2602 	char *remote_host;
2603 
2604 	debug("Received X11 open request.");
2605 
2606 	remote_id = packet_get_int();
2607 
2608 	if (packet_get_protocol_flags() & SSH_PROTOFLAG_HOST_IN_FWD_OPEN) {
2609 		remote_host = packet_get_string(NULL);
2610 	} else {
2611 		remote_host = xstrdup("unknown (remote did not supply name)");
2612 	}
2613 	packet_check_eom();
2614 
2615 	/* Obtain a connection to the real X display. */
2616 	sock = x11_connect_display();
2617 	if (sock != -1) {
2618 		/* Allocate a channel for this connection. */
2619 		c = channel_new("connected x11 socket",
2620 		    SSH_CHANNEL_X11_OPEN, sock, sock, -1, 0, 0, 0,
2621 		    remote_host, 1);
2622 		if (c == NULL) {
2623 			error("x11_input_open: channel_new failed");
2624 			close(sock);
2625 		} else {
2626 			c->remote_id = remote_id;
2627 			c->force_drain = 1;
2628 		}
2629 	}
2630 	if (c == NULL) {
2631 		/* Send refusal to the remote host. */
2632 		packet_start(SSH_MSG_CHANNEL_OPEN_FAILURE);
2633 		packet_put_int(remote_id);
2634 	} else {
2635 		/* Send a confirmation to the remote host. */
2636 		packet_start(SSH_MSG_CHANNEL_OPEN_CONFIRMATION);
2637 		packet_put_int(remote_id);
2638 		packet_put_int(c->self);
2639 	}
2640 	packet_send();
2641 }
2642 
2643 /* dummy protocol handler that denies SSH-1 requests (agent/x11) */
2644 void
2645 deny_input_open(int type, u_int32_t seq, void *ctxt)
2646 {
2647 	int rchan = packet_get_int();
2648 	switch (type) {
2649 	case SSH_SMSG_AGENT_OPEN:
2650 		error("Warning: ssh server tried agent forwarding.");
2651 		break;
2652 	case SSH_SMSG_X11_OPEN:
2653 		error("Warning: ssh server tried X11 forwarding.");
2654 		break;
2655 	default:
2656 		error("deny_input_open: type %d", type);
2657 		break;
2658 	}
2659 	error("Warning: this is probably a break in attempt by a malicious server.");
2660 	packet_start(SSH_MSG_CHANNEL_OPEN_FAILURE);
2661 	packet_put_int(rchan);
2662 	packet_send();
2663 }
2664 
2665 /*
2666  * Requests forwarding of X11 connections, generates fake authentication
2667  * data, and enables authentication spoofing.
2668  * This should be called in the client only.
2669  */
2670 void
2671 x11_request_forwarding_with_spoofing(int client_session_id,
2672     const char *proto, const char *data)
2673 {
2674 	u_int data_len = (u_int) strlen(data) / 2;
2675 	u_int i, value, len;
2676 	char *new_data;
2677 	int screen_number;
2678 	const char *cp;
2679 	u_int32_t rand = 0;
2680 
2681 	cp = getenv("DISPLAY");
2682 	if (cp)
2683 		cp = strchr(cp, ':');
2684 	if (cp)
2685 		cp = strchr(cp, '.');
2686 	if (cp)
2687 		screen_number = atoi(cp + 1);
2688 	else
2689 		screen_number = 0;
2690 
2691 	/* Save protocol name. */
2692 	x11_saved_proto = xstrdup(proto);
2693 
2694 	/*
2695 	 * Extract real authentication data and generate fake data of the
2696 	 * same length.
2697 	 */
2698 	x11_saved_data = xmalloc(data_len);
2699 	x11_fake_data = xmalloc(data_len);
2700 	for (i = 0; i < data_len; i++) {
2701 		if (sscanf(data + 2 * i, "%2x", &value) != 1)
2702 			fatal("x11_request_forwarding: bad authentication data: %.100s", data);
2703 		if (i % 4 == 0)
2704 			rand = arc4random();
2705 		x11_saved_data[i] = value;
2706 		x11_fake_data[i] = rand & 0xff;
2707 		rand >>= 8;
2708 	}
2709 	x11_saved_data_len = data_len;
2710 	x11_fake_data_len = data_len;
2711 
2712 	/* Convert the fake data into hex. */
2713 	len = 2 * data_len + 1;
2714 	new_data = xmalloc(len);
2715 	for (i = 0; i < data_len; i++)
2716 		snprintf(new_data + 2 * i, len - 2 * i,
2717 		    "%02x", (u_char) x11_fake_data[i]);
2718 
2719 	/* Send the request packet. */
2720 	if (compat20) {
2721 		channel_request_start(client_session_id, "x11-req", 0);
2722 		packet_put_char(0);	/* XXX bool single connection */
2723 	} else {
2724 		packet_start(SSH_CMSG_X11_REQUEST_FORWARDING);
2725 	}
2726 	packet_put_cstring(proto);
2727 	packet_put_cstring(new_data);
2728 	packet_put_int(screen_number);
2729 	packet_send();
2730 	packet_write_wait();
2731 	xfree(new_data);
2732 }
2733 
2734 
2735 /* -- agent forwarding */
2736 
2737 /* Sends a message to the server to request authentication fd forwarding. */
2738 
2739 void
2740 auth_request_forwarding(void)
2741 {
2742 	packet_start(SSH_CMSG_AGENT_REQUEST_FORWARDING);
2743 	packet_send();
2744 	packet_write_wait();
2745 }
2746 
2747 /*
2748  * Returns the name of the forwarded authentication socket.  Returns NULL if
2749  * there is no forwarded authentication socket.  The returned value points to
2750  * a static buffer.
2751  */
2752 
2753 char *
2754 auth_get_socket_name(void)
2755 {
2756 	return auth_sock_name;
2757 }
2758 
2759 /* removes the agent forwarding socket */
2760 
2761 void
2762 auth_sock_cleanup_proc(void *_pw)
2763 {
2764 	struct passwd *pw = _pw;
2765 
2766 	if (auth_sock_name) {
2767 		temporarily_use_uid(pw);
2768 		unlink(auth_sock_name);
2769 		rmdir(auth_sock_dir);
2770 		auth_sock_name = NULL;
2771 		restore_uid();
2772 	}
2773 }
2774 
2775 /*
2776  * This is called to process SSH_CMSG_AGENT_REQUEST_FORWARDING on the server.
2777  * This starts forwarding authentication requests.
2778  */
2779 
2780 int
2781 auth_input_request_forwarding(struct passwd * pw)
2782 {
2783 	Channel *nc;
2784 	int sock;
2785 	struct sockaddr_un sunaddr;
2786 
2787 	if (auth_get_socket_name() != NULL) {
2788 		error("authentication forwarding requested twice.");
2789 		return 0;
2790 	}
2791 
2792 	/* Temporarily drop privileged uid for mkdir/bind. */
2793 	temporarily_use_uid(pw);
2794 
2795 	/* Allocate a buffer for the socket name, and format the name. */
2796 	auth_sock_name = xmalloc(MAXPATHLEN);
2797 	auth_sock_dir = xmalloc(MAXPATHLEN);
2798 	strlcpy(auth_sock_dir, "/tmp/ssh-XXXXXXXX", MAXPATHLEN);
2799 
2800 	/* Create private directory for socket */
2801 	if (mkdtemp(auth_sock_dir) == NULL) {
2802 		packet_send_debug("Agent forwarding disabled: "
2803 		    "mkdtemp() failed: %.100s", strerror(errno));
2804 		restore_uid();
2805 		xfree(auth_sock_name);
2806 		xfree(auth_sock_dir);
2807 		auth_sock_name = NULL;
2808 		auth_sock_dir = NULL;
2809 		return 0;
2810 	}
2811 	snprintf(auth_sock_name, MAXPATHLEN, "%s/agent.%d",
2812 		 auth_sock_dir, (int) getpid());
2813 
2814 	/* delete agent socket on fatal() */
2815 	fatal_add_cleanup(auth_sock_cleanup_proc, pw);
2816 
2817 	/* Create the socket. */
2818 	sock = socket(AF_UNIX, SOCK_STREAM, 0);
2819 	if (sock < 0)
2820 		packet_disconnect("socket: %.100s", strerror(errno));
2821 
2822 	/* Bind it to the name. */
2823 	memset(&sunaddr, 0, sizeof(sunaddr));
2824 	sunaddr.sun_family = AF_UNIX;
2825 	strlcpy(sunaddr.sun_path, auth_sock_name, sizeof(sunaddr.sun_path));
2826 
2827 	if (bind(sock, (struct sockaddr *) & sunaddr, sizeof(sunaddr)) < 0)
2828 		packet_disconnect("bind: %.100s", strerror(errno));
2829 
2830 	/* Restore the privileged uid. */
2831 	restore_uid();
2832 
2833 	/* Start listening on the socket. */
2834 	if (listen(sock, 5) < 0)
2835 		packet_disconnect("listen: %.100s", strerror(errno));
2836 
2837 	/* Allocate a channel for the authentication agent socket. */
2838 	nc = channel_new("auth socket",
2839 	    SSH_CHANNEL_AUTH_SOCKET, sock, sock, -1,
2840 	    CHAN_X11_WINDOW_DEFAULT, CHAN_X11_PACKET_DEFAULT,
2841 	    0, xstrdup("auth socket"), 1);
2842 	if (nc == NULL) {
2843 		error("auth_input_request_forwarding: channel_new failed");
2844 		auth_sock_cleanup_proc(pw);
2845 		fatal_remove_cleanup(auth_sock_cleanup_proc, pw);
2846 		close(sock);
2847 		return 0;
2848 	}
2849 	strlcpy(nc->path, auth_sock_name, sizeof(nc->path));
2850 	return 1;
2851 }
2852 
2853 /* This is called to process an SSH_SMSG_AGENT_OPEN message. */
2854 
2855 void
2856 auth_input_open_request(int type, u_int32_t seq, void *ctxt)
2857 {
2858 	Channel *c = NULL;
2859 	int remote_id, sock;
2860 	char *name;
2861 
2862 	/* Read the remote channel number from the message. */
2863 	remote_id = packet_get_int();
2864 	packet_check_eom();
2865 
2866 	/*
2867 	 * Get a connection to the local authentication agent (this may again
2868 	 * get forwarded).
2869 	 */
2870 	sock = ssh_get_authentication_socket();
2871 
2872 	/*
2873 	 * If we could not connect the agent, send an error message back to
2874 	 * the server. This should never happen unless the agent dies,
2875 	 * because authentication forwarding is only enabled if we have an
2876 	 * agent.
2877 	 */
2878 	if (sock >= 0) {
2879 		name = xstrdup("authentication agent connection");
2880 		c = channel_new("", SSH_CHANNEL_OPEN, sock, sock,
2881 		    -1, 0, 0, 0, name, 1);
2882 		if (c == NULL) {
2883 			error("auth_input_open_request: channel_new failed");
2884 			xfree(name);
2885 			close(sock);
2886 		} else {
2887 			c->remote_id = remote_id;
2888 			c->force_drain = 1;
2889 		}
2890 	}
2891 	if (c == NULL) {
2892 		packet_start(SSH_MSG_CHANNEL_OPEN_FAILURE);
2893 		packet_put_int(remote_id);
2894 	} else {
2895 		/* Send a confirmation to the remote host. */
2896 		debug("Forwarding authentication connection.");
2897 		packet_start(SSH_MSG_CHANNEL_OPEN_CONFIRMATION);
2898 		packet_put_int(remote_id);
2899 		packet_put_int(c->self);
2900 	}
2901 	packet_send();
2902 }
2903