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