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