]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - crypto/openssh/channels.c
contrib/tzdata: import tzdata 2022d
[FreeBSD/FreeBSD.git] / crypto / openssh / channels.c
1 /* $OpenBSD: channels.c,v 1.416 2022/04/11 22:52:08 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/stat.h>
46 #include <sys/ioctl.h>
47 #include <sys/un.h>
48 #include <sys/socket.h>
49 #ifdef HAVE_SYS_TIME_H
50 # include <sys/time.h>
51 #endif
52
53 #include <netinet/in.h>
54 #include <arpa/inet.h>
55
56 #include <errno.h>
57 #include <fcntl.h>
58 #include <limits.h>
59 #include <netdb.h>
60 #ifdef HAVE_POLL_H
61 #include <poll.h>
62 #endif
63 #include <stdarg.h>
64 #ifdef HAVE_STDINT_H
65 # include <stdint.h>
66 #endif
67 #include <stdio.h>
68 #include <stdlib.h>
69 #include <string.h>
70 #include <termios.h>
71 #include <unistd.h>
72
73 #include "openbsd-compat/sys-queue.h"
74 #include "xmalloc.h"
75 #include "ssh.h"
76 #include "ssh2.h"
77 #include "ssherr.h"
78 #include "sshbuf.h"
79 #include "packet.h"
80 #include "log.h"
81 #include "misc.h"
82 #include "channels.h"
83 #include "compat.h"
84 #include "canohost.h"
85 #include "sshkey.h"
86 #include "authfd.h"
87 #include "pathnames.h"
88 #include "match.h"
89
90 /* XXX remove once we're satisfied there's no lurking bugs */
91 /* #define DEBUG_CHANNEL_POLL 1 */
92
93 /* -- agent forwarding */
94 #define NUM_SOCKS       10
95
96 /* -- tcp forwarding */
97 /* special-case port number meaning allow any port */
98 #define FWD_PERMIT_ANY_PORT     0
99
100 /* special-case wildcard meaning allow any host */
101 #define FWD_PERMIT_ANY_HOST     "*"
102
103 /* -- X11 forwarding */
104 /* Maximum number of fake X11 displays to try. */
105 #define MAX_DISPLAYS  1000
106
107 /* Per-channel callback for pre/post IO actions */
108 typedef void chan_fn(struct ssh *, Channel *c);
109
110 /*
111  * Data structure for storing which hosts are permitted for forward requests.
112  * The local sides of any remote forwards are stored in this array to prevent
113  * a corrupt remote server from accessing arbitrary TCP/IP ports on our local
114  * network (which might be behind a firewall).
115  */
116 /* XXX: streamlocal wants a path instead of host:port */
117 /*      Overload host_to_connect; we could just make this match Forward */
118 /*      XXX - can we use listen_host instead of listen_path? */
119 struct permission {
120         char *host_to_connect;          /* Connect to 'host'. */
121         int port_to_connect;            /* Connect to 'port'. */
122         char *listen_host;              /* Remote side should listen address. */
123         char *listen_path;              /* Remote side should listen path. */
124         int listen_port;                /* Remote side should listen port. */
125         Channel *downstream;            /* Downstream mux*/
126 };
127
128 /*
129  * Stores the forwarding permission state for a single direction (local or
130  * remote).
131  */
132 struct permission_set {
133         /*
134          * List of all local permitted host/port pairs to allow for the
135          * user.
136          */
137         u_int num_permitted_user;
138         struct permission *permitted_user;
139
140         /*
141          * List of all permitted host/port pairs to allow for the admin.
142          */
143         u_int num_permitted_admin;
144         struct permission *permitted_admin;
145
146         /*
147          * If this is true, all opens/listens are permitted.  This is the
148          * case on the server on which we have to trust the client anyway,
149          * and the user could do anything after logging in.
150          */
151         int all_permitted;
152 };
153
154 /* Master structure for channels state */
155 struct ssh_channels {
156         /*
157          * Pointer to an array containing all allocated channels.  The array
158          * is dynamically extended as needed.
159          */
160         Channel **channels;
161
162         /*
163          * Size of the channel array.  All slots of the array must always be
164          * initialized (at least the type field); unused slots set to NULL
165          */
166         u_int channels_alloc;
167
168         /*
169          * 'channel_pre*' are called just before IO to add any bits
170          * relevant to channels in the c->io_want bitmasks.
171          *
172          * 'channel_post*': perform any appropriate operations for
173          * channels which have c->io_ready events pending.
174          */
175         chan_fn **channel_pre;
176         chan_fn **channel_post;
177
178         /* -- tcp forwarding */
179         struct permission_set local_perms;
180         struct permission_set remote_perms;
181
182         /* -- X11 forwarding */
183
184         /* Saved X11 local (client) display. */
185         char *x11_saved_display;
186
187         /* Saved X11 authentication protocol name. */
188         char *x11_saved_proto;
189
190         /* Saved X11 authentication data.  This is the real data. */
191         char *x11_saved_data;
192         u_int x11_saved_data_len;
193
194         /* Deadline after which all X11 connections are refused */
195         u_int x11_refuse_time;
196
197         /*
198          * Fake X11 authentication data.  This is what the server will be
199          * sending us; we should replace any occurrences of this by the
200          * real data.
201          */
202         u_char *x11_fake_data;
203         u_int x11_fake_data_len;
204
205         /* AF_UNSPEC or AF_INET or AF_INET6 */
206         int IPv4or6;
207 };
208
209 /* helper */
210 static void port_open_helper(struct ssh *ssh, Channel *c, char *rtype);
211 static const char *channel_rfwd_bind_host(const char *listen_host);
212
213 /* non-blocking connect helpers */
214 static int connect_next(struct channel_connect *);
215 static void channel_connect_ctx_free(struct channel_connect *);
216 static Channel *rdynamic_connect_prepare(struct ssh *, char *, char *);
217 static int rdynamic_connect_finish(struct ssh *, Channel *);
218
219 /* Setup helper */
220 static void channel_handler_init(struct ssh_channels *sc);
221
222 /* -- channel core */
223
224 void
225 channel_init_channels(struct ssh *ssh)
226 {
227         struct ssh_channels *sc;
228
229         if ((sc = calloc(1, sizeof(*sc))) == NULL)
230                 fatal_f("allocation failed");
231         sc->channels_alloc = 10;
232         sc->channels = xcalloc(sc->channels_alloc, sizeof(*sc->channels));
233         sc->IPv4or6 = AF_UNSPEC;
234         channel_handler_init(sc);
235
236         ssh->chanctxt = sc;
237 }
238
239 Channel *
240 channel_by_id(struct ssh *ssh, int id)
241 {
242         Channel *c;
243
244         if (id < 0 || (u_int)id >= ssh->chanctxt->channels_alloc) {
245                 logit_f("%d: bad id", id);
246                 return NULL;
247         }
248         c = ssh->chanctxt->channels[id];
249         if (c == NULL) {
250                 logit_f("%d: bad id: channel free", id);
251                 return NULL;
252         }
253         return c;
254 }
255
256 Channel *
257 channel_by_remote_id(struct ssh *ssh, u_int remote_id)
258 {
259         Channel *c;
260         u_int i;
261
262         for (i = 0; i < ssh->chanctxt->channels_alloc; i++) {
263                 c = ssh->chanctxt->channels[i];
264                 if (c != NULL && c->have_remote_id && c->remote_id == remote_id)
265                         return c;
266         }
267         return NULL;
268 }
269
270 /*
271  * Returns the channel if it is allowed to receive protocol messages.
272  * Private channels, like listening sockets, may not receive messages.
273  */
274 Channel *
275 channel_lookup(struct ssh *ssh, int id)
276 {
277         Channel *c;
278
279         if ((c = channel_by_id(ssh, id)) == NULL)
280                 return NULL;
281
282         switch (c->type) {
283         case SSH_CHANNEL_X11_OPEN:
284         case SSH_CHANNEL_LARVAL:
285         case SSH_CHANNEL_CONNECTING:
286         case SSH_CHANNEL_DYNAMIC:
287         case SSH_CHANNEL_RDYNAMIC_OPEN:
288         case SSH_CHANNEL_RDYNAMIC_FINISH:
289         case SSH_CHANNEL_OPENING:
290         case SSH_CHANNEL_OPEN:
291         case SSH_CHANNEL_ABANDONED:
292         case SSH_CHANNEL_MUX_PROXY:
293                 return c;
294         }
295         logit("Non-public channel %d, type %d.", id, c->type);
296         return NULL;
297 }
298
299 /*
300  * Register filedescriptors for a channel, used when allocating a channel or
301  * when the channel consumer/producer is ready, e.g. shell exec'd
302  */
303 static void
304 channel_register_fds(struct ssh *ssh, Channel *c, int rfd, int wfd, int efd,
305     int extusage, int nonblock, int is_tty)
306 {
307         if (rfd != -1)
308                 fcntl(rfd, F_SETFD, FD_CLOEXEC);
309         if (wfd != -1 && wfd != rfd)
310                 fcntl(wfd, F_SETFD, FD_CLOEXEC);
311         if (efd != -1 && efd != rfd && efd != wfd)
312                 fcntl(efd, F_SETFD, FD_CLOEXEC);
313
314         c->rfd = rfd;
315         c->wfd = wfd;
316         c->sock = (rfd == wfd) ? rfd : -1;
317         c->efd = efd;
318         c->extended_usage = extusage;
319
320         if ((c->isatty = is_tty) != 0)
321                 debug2("channel %d: rfd %d isatty", c->self, c->rfd);
322 #ifdef _AIX
323         /* XXX: Later AIX versions can't push as much data to tty */
324         c->wfd_isatty = is_tty || isatty(c->wfd);
325 #endif
326
327         /* enable nonblocking mode */
328         c->restore_block = 0;
329         if (nonblock == CHANNEL_NONBLOCK_STDIO) {
330                 /*
331                  * Special handling for stdio file descriptors: do not set
332                  * non-blocking mode if they are TTYs. Otherwise prepare to
333                  * restore their blocking state on exit to avoid interfering
334                  * with other programs that follow.
335                  */
336                 if (rfd != -1 && !isatty(rfd) && fcntl(rfd, F_GETFL) == 0) {
337                         c->restore_block |= CHANNEL_RESTORE_RFD;
338                         set_nonblock(rfd);
339                 }
340                 if (wfd != -1 && !isatty(wfd) && fcntl(wfd, F_GETFL) == 0) {
341                         c->restore_block |= CHANNEL_RESTORE_WFD;
342                         set_nonblock(wfd);
343                 }
344                 if (efd != -1 && !isatty(efd) && fcntl(efd, F_GETFL) == 0) {
345                         c->restore_block |= CHANNEL_RESTORE_EFD;
346                         set_nonblock(efd);
347                 }
348         } else if (nonblock) {
349                 if (rfd != -1)
350                         set_nonblock(rfd);
351                 if (wfd != -1)
352                         set_nonblock(wfd);
353                 if (efd != -1)
354                         set_nonblock(efd);
355         }
356 }
357
358 /*
359  * Allocate a new channel object and set its type and socket. This will cause
360  * remote_name to be freed.
361  */
362 Channel *
363 channel_new(struct ssh *ssh, char *ctype, int type, int rfd, int wfd, int efd,
364     u_int window, u_int maxpack, int extusage, char *remote_name, int nonblock)
365 {
366         struct ssh_channels *sc = ssh->chanctxt;
367         u_int i, found;
368         Channel *c;
369         int r;
370
371         /* Try to find a free slot where to put the new channel. */
372         for (i = 0; i < sc->channels_alloc; i++) {
373                 if (sc->channels[i] == NULL) {
374                         /* Found a free slot. */
375                         found = i;
376                         break;
377                 }
378         }
379         if (i >= sc->channels_alloc) {
380                 /*
381                  * There are no free slots. Take last+1 slot and expand
382                  * the array.
383                  */
384                 found = sc->channels_alloc;
385                 if (sc->channels_alloc > CHANNELS_MAX_CHANNELS)
386                         fatal_f("internal error: channels_alloc %d too big",
387                             sc->channels_alloc);
388                 sc->channels = xrecallocarray(sc->channels, sc->channels_alloc,
389                     sc->channels_alloc + 10, sizeof(*sc->channels));
390                 sc->channels_alloc += 10;
391                 debug2("channel: expanding %d", sc->channels_alloc);
392         }
393         /* Initialize and return new channel. */
394         c = sc->channels[found] = xcalloc(1, sizeof(Channel));
395         if ((c->input = sshbuf_new()) == NULL ||
396             (c->output = sshbuf_new()) == NULL ||
397             (c->extended = sshbuf_new()) == NULL)
398                 fatal_f("sshbuf_new failed");
399         if ((r = sshbuf_set_max_size(c->input, CHAN_INPUT_MAX)) != 0)
400                 fatal_fr(r, "sshbuf_set_max_size");
401         c->ostate = CHAN_OUTPUT_OPEN;
402         c->istate = CHAN_INPUT_OPEN;
403         channel_register_fds(ssh, c, rfd, wfd, efd, extusage, nonblock, 0);
404         c->self = found;
405         c->type = type;
406         c->ctype = ctype;
407         c->local_window = window;
408         c->local_window_max = window;
409         c->local_maxpacket = maxpack;
410         c->remote_name = xstrdup(remote_name);
411         c->ctl_chan = -1;
412         c->delayed = 1;         /* prevent call to channel_post handler */
413         TAILQ_INIT(&c->status_confirms);
414         debug("channel %d: new [%s]", found, remote_name);
415         return c;
416 }
417
418 int
419 channel_close_fd(struct ssh *ssh, Channel *c, int *fdp)
420 {
421         int ret, fd = *fdp;
422
423         if (fd == -1)
424                 return 0;
425
426         if ((*fdp == c->rfd && (c->restore_block & CHANNEL_RESTORE_RFD) != 0) ||
427            (*fdp == c->wfd && (c->restore_block & CHANNEL_RESTORE_WFD) != 0) ||
428            (*fdp == c->efd && (c->restore_block & CHANNEL_RESTORE_EFD) != 0))
429                 (void)fcntl(*fdp, F_SETFL, 0);  /* restore blocking */
430
431         if (*fdp == c->rfd) {
432                 c->io_want &= ~SSH_CHAN_IO_RFD;
433                 c->io_ready &= ~SSH_CHAN_IO_RFD;
434                 c->rfd = -1;
435                 c->pfds[0] = -1;
436         }
437         if (*fdp == c->wfd) {
438                 c->io_want &= ~SSH_CHAN_IO_WFD;
439                 c->io_ready &= ~SSH_CHAN_IO_WFD;
440                 c->wfd = -1;
441                 c->pfds[1] = -1;
442         }
443         if (*fdp == c->efd) {
444                 c->io_want &= ~SSH_CHAN_IO_EFD;
445                 c->io_ready &= ~SSH_CHAN_IO_EFD;
446                 c->efd = -1;
447                 c->pfds[2] = -1;
448         }
449         if (*fdp == c->sock) {
450                 c->io_want &= ~SSH_CHAN_IO_SOCK;
451                 c->io_ready &= ~SSH_CHAN_IO_SOCK;
452                 c->sock = -1;
453                 c->pfds[3] = -1;
454         }
455
456         ret = close(fd);
457         *fdp = -1; /* probably redundant */
458         return ret;
459 }
460
461 /* Close all channel fd/socket. */
462 static void
463 channel_close_fds(struct ssh *ssh, Channel *c)
464 {
465         int sock = c->sock, rfd = c->rfd, wfd = c->wfd, efd = c->efd;
466
467         channel_close_fd(ssh, c, &c->sock);
468         if (rfd != sock)
469                 channel_close_fd(ssh, c, &c->rfd);
470         if (wfd != sock && wfd != rfd)
471                 channel_close_fd(ssh, c, &c->wfd);
472         if (efd != sock && efd != rfd && efd != wfd)
473                 channel_close_fd(ssh, c, &c->efd);
474 }
475
476 static void
477 fwd_perm_clear(struct permission *perm)
478 {
479         free(perm->host_to_connect);
480         free(perm->listen_host);
481         free(perm->listen_path);
482         memset(perm, 0, sizeof(*perm));
483 }
484
485 /* Returns an printable name for the specified forwarding permission list */
486 static const char *
487 fwd_ident(int who, int where)
488 {
489         if (who == FORWARD_ADM) {
490                 if (where == FORWARD_LOCAL)
491                         return "admin local";
492                 else if (where == FORWARD_REMOTE)
493                         return "admin remote";
494         } else if (who == FORWARD_USER) {
495                 if (where == FORWARD_LOCAL)
496                         return "user local";
497                 else if (where == FORWARD_REMOTE)
498                         return "user remote";
499         }
500         fatal("Unknown forward permission list %d/%d", who, where);
501 }
502
503 /* Returns the forwarding permission list for the specified direction */
504 static struct permission_set *
505 permission_set_get(struct ssh *ssh, int where)
506 {
507         struct ssh_channels *sc = ssh->chanctxt;
508
509         switch (where) {
510         case FORWARD_LOCAL:
511                 return &sc->local_perms;
512                 break;
513         case FORWARD_REMOTE:
514                 return &sc->remote_perms;
515                 break;
516         default:
517                 fatal_f("invalid forwarding direction %d", where);
518         }
519 }
520
521 /* Returns pointers to the specified forwarding list and its element count */
522 static void
523 permission_set_get_array(struct ssh *ssh, int who, int where,
524     struct permission ***permpp, u_int **npermpp)
525 {
526         struct permission_set *pset = permission_set_get(ssh, where);
527
528         switch (who) {
529         case FORWARD_USER:
530                 *permpp = &pset->permitted_user;
531                 *npermpp = &pset->num_permitted_user;
532                 break;
533         case FORWARD_ADM:
534                 *permpp = &pset->permitted_admin;
535                 *npermpp = &pset->num_permitted_admin;
536                 break;
537         default:
538                 fatal_f("invalid forwarding client %d", who);
539         }
540 }
541
542 /* Adds an entry to the specified forwarding list */
543 static int
544 permission_set_add(struct ssh *ssh, int who, int where,
545     const char *host_to_connect, int port_to_connect,
546     const char *listen_host, const char *listen_path, int listen_port,
547     Channel *downstream)
548 {
549         struct permission **permp;
550         u_int n, *npermp;
551
552         permission_set_get_array(ssh, who, where, &permp, &npermp);
553
554         if (*npermp >= INT_MAX)
555                 fatal_f("%s overflow", fwd_ident(who, where));
556
557         *permp = xrecallocarray(*permp, *npermp, *npermp + 1, sizeof(**permp));
558         n = (*npermp)++;
559 #define MAYBE_DUP(s) ((s == NULL) ? NULL : xstrdup(s))
560         (*permp)[n].host_to_connect = MAYBE_DUP(host_to_connect);
561         (*permp)[n].port_to_connect = port_to_connect;
562         (*permp)[n].listen_host = MAYBE_DUP(listen_host);
563         (*permp)[n].listen_path = MAYBE_DUP(listen_path);
564         (*permp)[n].listen_port = listen_port;
565         (*permp)[n].downstream = downstream;
566 #undef MAYBE_DUP
567         return (int)n;
568 }
569
570 static void
571 mux_remove_remote_forwardings(struct ssh *ssh, Channel *c)
572 {
573         struct ssh_channels *sc = ssh->chanctxt;
574         struct permission_set *pset = &sc->local_perms;
575         struct permission *perm;
576         int r;
577         u_int i;
578
579         for (i = 0; i < pset->num_permitted_user; i++) {
580                 perm = &pset->permitted_user[i];
581                 if (perm->downstream != c)
582                         continue;
583
584                 /* cancel on the server, since mux client is gone */
585                 debug("channel %d: cleanup remote forward for %s:%u",
586                     c->self, perm->listen_host, perm->listen_port);
587                 if ((r = sshpkt_start(ssh, SSH2_MSG_GLOBAL_REQUEST)) != 0 ||
588                     (r = sshpkt_put_cstring(ssh,
589                     "cancel-tcpip-forward")) != 0 ||
590                     (r = sshpkt_put_u8(ssh, 0)) != 0 ||
591                     (r = sshpkt_put_cstring(ssh,
592                     channel_rfwd_bind_host(perm->listen_host))) != 0 ||
593                     (r = sshpkt_put_u32(ssh, perm->listen_port)) != 0 ||
594                     (r = sshpkt_send(ssh)) != 0) {
595                         fatal_fr(r, "channel %i", c->self);
596                 }
597                 fwd_perm_clear(perm); /* unregister */
598         }
599 }
600
601 /* Free the channel and close its fd/socket. */
602 void
603 channel_free(struct ssh *ssh, Channel *c)
604 {
605         struct ssh_channels *sc = ssh->chanctxt;
606         char *s;
607         u_int i, n;
608         Channel *other;
609         struct channel_confirm *cc;
610
611         for (n = 0, i = 0; i < sc->channels_alloc; i++) {
612                 if ((other = sc->channels[i]) == NULL)
613                         continue;
614                 n++;
615                 /* detach from mux client and prepare for closing */
616                 if (c->type == SSH_CHANNEL_MUX_CLIENT &&
617                     other->type == SSH_CHANNEL_MUX_PROXY &&
618                     other->mux_ctx == c) {
619                         other->mux_ctx = NULL;
620                         other->type = SSH_CHANNEL_OPEN;
621                         other->istate = CHAN_INPUT_CLOSED;
622                         other->ostate = CHAN_OUTPUT_CLOSED;
623                 }
624         }
625         debug("channel %d: free: %s, nchannels %u", c->self,
626             c->remote_name ? c->remote_name : "???", n);
627
628         if (c->type == SSH_CHANNEL_MUX_CLIENT) {
629                 mux_remove_remote_forwardings(ssh, c);
630                 free(c->mux_ctx);
631                 c->mux_ctx = NULL;
632         } else if (c->type == SSH_CHANNEL_MUX_LISTENER) {
633                 free(c->mux_ctx);
634                 c->mux_ctx = NULL;
635         }
636
637         if (log_level_get() >= SYSLOG_LEVEL_DEBUG3) {
638                 s = channel_open_message(ssh);
639                 debug3("channel %d: status: %s", c->self, s);
640                 free(s);
641         }
642
643         channel_close_fds(ssh, c);
644         sshbuf_free(c->input);
645         sshbuf_free(c->output);
646         sshbuf_free(c->extended);
647         c->input = c->output = c->extended = NULL;
648         free(c->remote_name);
649         c->remote_name = NULL;
650         free(c->path);
651         c->path = NULL;
652         free(c->listening_addr);
653         c->listening_addr = NULL;
654         while ((cc = TAILQ_FIRST(&c->status_confirms)) != NULL) {
655                 if (cc->abandon_cb != NULL)
656                         cc->abandon_cb(ssh, c, cc->ctx);
657                 TAILQ_REMOVE(&c->status_confirms, cc, entry);
658                 freezero(cc, sizeof(*cc));
659         }
660         if (c->filter_cleanup != NULL && c->filter_ctx != NULL)
661                 c->filter_cleanup(ssh, c->self, c->filter_ctx);
662         sc->channels[c->self] = NULL;
663         freezero(c, sizeof(*c));
664 }
665
666 void
667 channel_free_all(struct ssh *ssh)
668 {
669         u_int i;
670         struct ssh_channels *sc = ssh->chanctxt;
671
672         for (i = 0; i < sc->channels_alloc; i++)
673                 if (sc->channels[i] != NULL)
674                         channel_free(ssh, sc->channels[i]);
675
676         free(sc->channels);
677         sc->channels = NULL;
678         sc->channels_alloc = 0;
679
680         free(sc->x11_saved_display);
681         sc->x11_saved_display = NULL;
682
683         free(sc->x11_saved_proto);
684         sc->x11_saved_proto = NULL;
685
686         free(sc->x11_saved_data);
687         sc->x11_saved_data = NULL;
688         sc->x11_saved_data_len = 0;
689
690         free(sc->x11_fake_data);
691         sc->x11_fake_data = NULL;
692         sc->x11_fake_data_len = 0;
693 }
694
695 /*
696  * Closes the sockets/fds of all channels.  This is used to close extra file
697  * descriptors after a fork.
698  */
699 void
700 channel_close_all(struct ssh *ssh)
701 {
702         u_int i;
703
704         for (i = 0; i < ssh->chanctxt->channels_alloc; i++)
705                 if (ssh->chanctxt->channels[i] != NULL)
706                         channel_close_fds(ssh, ssh->chanctxt->channels[i]);
707 }
708
709 /*
710  * Stop listening to channels.
711  */
712 void
713 channel_stop_listening(struct ssh *ssh)
714 {
715         u_int i;
716         Channel *c;
717
718         for (i = 0; i < ssh->chanctxt->channels_alloc; i++) {
719                 c = ssh->chanctxt->channels[i];
720                 if (c != NULL) {
721                         switch (c->type) {
722                         case SSH_CHANNEL_AUTH_SOCKET:
723                         case SSH_CHANNEL_PORT_LISTENER:
724                         case SSH_CHANNEL_RPORT_LISTENER:
725                         case SSH_CHANNEL_X11_LISTENER:
726                         case SSH_CHANNEL_UNIX_LISTENER:
727                         case SSH_CHANNEL_RUNIX_LISTENER:
728                                 channel_close_fd(ssh, c, &c->sock);
729                                 channel_free(ssh, c);
730                                 break;
731                         }
732                 }
733         }
734 }
735
736 /*
737  * Returns true if no channel has too much buffered data, and false if one or
738  * more channel is overfull.
739  */
740 int
741 channel_not_very_much_buffered_data(struct ssh *ssh)
742 {
743         u_int i;
744         u_int maxsize = ssh_packet_get_maxsize(ssh);
745         Channel *c;
746
747         for (i = 0; i < ssh->chanctxt->channels_alloc; i++) {
748                 c = ssh->chanctxt->channels[i];
749                 if (c == NULL || c->type != SSH_CHANNEL_OPEN)
750                         continue;
751                 if (sshbuf_len(c->output) > maxsize) {
752                         debug2("channel %d: big output buffer %zu > %u",
753                             c->self, sshbuf_len(c->output), maxsize);
754                         return 0;
755                 }
756         }
757         return 1;
758 }
759
760 /* Returns true if any channel is still open. */
761 int
762 channel_still_open(struct ssh *ssh)
763 {
764         u_int i;
765         Channel *c;
766
767         for (i = 0; i < ssh->chanctxt->channels_alloc; i++) {
768                 c = ssh->chanctxt->channels[i];
769                 if (c == NULL)
770                         continue;
771                 switch (c->type) {
772                 case SSH_CHANNEL_X11_LISTENER:
773                 case SSH_CHANNEL_PORT_LISTENER:
774                 case SSH_CHANNEL_RPORT_LISTENER:
775                 case SSH_CHANNEL_MUX_LISTENER:
776                 case SSH_CHANNEL_CLOSED:
777                 case SSH_CHANNEL_AUTH_SOCKET:
778                 case SSH_CHANNEL_DYNAMIC:
779                 case SSH_CHANNEL_RDYNAMIC_OPEN:
780                 case SSH_CHANNEL_CONNECTING:
781                 case SSH_CHANNEL_ZOMBIE:
782                 case SSH_CHANNEL_ABANDONED:
783                 case SSH_CHANNEL_UNIX_LISTENER:
784                 case SSH_CHANNEL_RUNIX_LISTENER:
785                         continue;
786                 case SSH_CHANNEL_LARVAL:
787                         continue;
788                 case SSH_CHANNEL_OPENING:
789                 case SSH_CHANNEL_OPEN:
790                 case SSH_CHANNEL_RDYNAMIC_FINISH:
791                 case SSH_CHANNEL_X11_OPEN:
792                 case SSH_CHANNEL_MUX_CLIENT:
793                 case SSH_CHANNEL_MUX_PROXY:
794                         return 1;
795                 default:
796                         fatal_f("bad channel type %d", c->type);
797                         /* NOTREACHED */
798                 }
799         }
800         return 0;
801 }
802
803 /* Returns the id of an open channel suitable for keepaliving */
804 int
805 channel_find_open(struct ssh *ssh)
806 {
807         u_int i;
808         Channel *c;
809
810         for (i = 0; i < ssh->chanctxt->channels_alloc; i++) {
811                 c = ssh->chanctxt->channels[i];
812                 if (c == NULL || !c->have_remote_id)
813                         continue;
814                 switch (c->type) {
815                 case SSH_CHANNEL_CLOSED:
816                 case SSH_CHANNEL_DYNAMIC:
817                 case SSH_CHANNEL_RDYNAMIC_OPEN:
818                 case SSH_CHANNEL_RDYNAMIC_FINISH:
819                 case SSH_CHANNEL_X11_LISTENER:
820                 case SSH_CHANNEL_PORT_LISTENER:
821                 case SSH_CHANNEL_RPORT_LISTENER:
822                 case SSH_CHANNEL_MUX_LISTENER:
823                 case SSH_CHANNEL_MUX_CLIENT:
824                 case SSH_CHANNEL_MUX_PROXY:
825                 case SSH_CHANNEL_OPENING:
826                 case SSH_CHANNEL_CONNECTING:
827                 case SSH_CHANNEL_ZOMBIE:
828                 case SSH_CHANNEL_ABANDONED:
829                 case SSH_CHANNEL_UNIX_LISTENER:
830                 case SSH_CHANNEL_RUNIX_LISTENER:
831                         continue;
832                 case SSH_CHANNEL_LARVAL:
833                 case SSH_CHANNEL_AUTH_SOCKET:
834                 case SSH_CHANNEL_OPEN:
835                 case SSH_CHANNEL_X11_OPEN:
836                         return i;
837                 default:
838                         fatal_f("bad channel type %d", c->type);
839                         /* NOTREACHED */
840                 }
841         }
842         return -1;
843 }
844
845 /* Returns the state of the channel's extended usage flag */
846 const char *
847 channel_format_extended_usage(const Channel *c)
848 {
849         if (c->efd == -1)
850                 return "closed";
851
852         switch (c->extended_usage) {
853         case CHAN_EXTENDED_WRITE:
854                 return "write";
855         case CHAN_EXTENDED_READ:
856                 return "read";
857         case CHAN_EXTENDED_IGNORE:
858                 return "ignore";
859         default:
860                 return "UNKNOWN";
861         }
862 }
863
864 static char *
865 channel_format_status(const Channel *c)
866 {
867         char *ret = NULL;
868
869         xasprintf(&ret, "t%d %s%u i%u/%zu o%u/%zu e[%s]/%zu "
870             "fd %d/%d/%d sock %d cc %d io 0x%02x/0x%02x",
871             c->type,
872             c->have_remote_id ? "r" : "nr", c->remote_id,
873             c->istate, sshbuf_len(c->input),
874             c->ostate, sshbuf_len(c->output),
875             channel_format_extended_usage(c), sshbuf_len(c->extended),
876             c->rfd, c->wfd, c->efd, c->sock, c->ctl_chan,
877             c->io_want, c->io_ready);
878         return ret;
879 }
880
881 /*
882  * Returns a message describing the currently open forwarded connections,
883  * suitable for sending to the client.  The message contains crlf pairs for
884  * newlines.
885  */
886 char *
887 channel_open_message(struct ssh *ssh)
888 {
889         struct sshbuf *buf;
890         Channel *c;
891         u_int i;
892         int r;
893         char *cp, *ret;
894
895         if ((buf = sshbuf_new()) == NULL)
896                 fatal_f("sshbuf_new");
897         if ((r = sshbuf_putf(buf,
898             "The following connections are open:\r\n")) != 0)
899                 fatal_fr(r, "sshbuf_putf");
900         for (i = 0; i < ssh->chanctxt->channels_alloc; i++) {
901                 c = ssh->chanctxt->channels[i];
902                 if (c == NULL)
903                         continue;
904                 switch (c->type) {
905                 case SSH_CHANNEL_X11_LISTENER:
906                 case SSH_CHANNEL_PORT_LISTENER:
907                 case SSH_CHANNEL_RPORT_LISTENER:
908                 case SSH_CHANNEL_CLOSED:
909                 case SSH_CHANNEL_AUTH_SOCKET:
910                 case SSH_CHANNEL_ZOMBIE:
911                 case SSH_CHANNEL_ABANDONED:
912                 case SSH_CHANNEL_MUX_LISTENER:
913                 case SSH_CHANNEL_UNIX_LISTENER:
914                 case SSH_CHANNEL_RUNIX_LISTENER:
915                         continue;
916                 case SSH_CHANNEL_LARVAL:
917                 case SSH_CHANNEL_OPENING:
918                 case SSH_CHANNEL_CONNECTING:
919                 case SSH_CHANNEL_DYNAMIC:
920                 case SSH_CHANNEL_RDYNAMIC_OPEN:
921                 case SSH_CHANNEL_RDYNAMIC_FINISH:
922                 case SSH_CHANNEL_OPEN:
923                 case SSH_CHANNEL_X11_OPEN:
924                 case SSH_CHANNEL_MUX_PROXY:
925                 case SSH_CHANNEL_MUX_CLIENT:
926                         cp = channel_format_status(c);
927                         if ((r = sshbuf_putf(buf, "  #%d %.300s (%s)\r\n",
928                             c->self, c->remote_name, cp)) != 0) {
929                                 free(cp);
930                                 fatal_fr(r, "sshbuf_putf");
931                         }
932                         free(cp);
933                         continue;
934                 default:
935                         fatal_f("bad channel type %d", c->type);
936                         /* NOTREACHED */
937                 }
938         }
939         if ((ret = sshbuf_dup_string(buf)) == NULL)
940                 fatal_f("sshbuf_dup_string");
941         sshbuf_free(buf);
942         return ret;
943 }
944
945 static void
946 open_preamble(struct ssh *ssh, const char *where, Channel *c, const char *type)
947 {
948         int r;
949
950         if ((r = sshpkt_start(ssh, SSH2_MSG_CHANNEL_OPEN)) != 0 ||
951             (r = sshpkt_put_cstring(ssh, type)) != 0 ||
952             (r = sshpkt_put_u32(ssh, c->self)) != 0 ||
953             (r = sshpkt_put_u32(ssh, c->local_window)) != 0 ||
954             (r = sshpkt_put_u32(ssh, c->local_maxpacket)) != 0) {
955                 fatal_r(r, "%s: channel %i: open", where, c->self);
956         }
957 }
958
959 void
960 channel_send_open(struct ssh *ssh, int id)
961 {
962         Channel *c = channel_lookup(ssh, id);
963         int r;
964
965         if (c == NULL) {
966                 logit("channel_send_open: %d: bad id", id);
967                 return;
968         }
969         debug2("channel %d: send open", id);
970         open_preamble(ssh, __func__, c, c->ctype);
971         if ((r = sshpkt_send(ssh)) != 0)
972                 fatal_fr(r, "channel %i", c->self);
973 }
974
975 void
976 channel_request_start(struct ssh *ssh, int id, char *service, int wantconfirm)
977 {
978         Channel *c = channel_lookup(ssh, id);
979         int r;
980
981         if (c == NULL) {
982                 logit_f("%d: unknown channel id", id);
983                 return;
984         }
985         if (!c->have_remote_id)
986                 fatal_f("channel %d: no remote id", c->self);
987
988         debug2("channel %d: request %s confirm %d", id, service, wantconfirm);
989         if ((r = sshpkt_start(ssh, SSH2_MSG_CHANNEL_REQUEST)) != 0 ||
990             (r = sshpkt_put_u32(ssh, c->remote_id)) != 0 ||
991             (r = sshpkt_put_cstring(ssh, service)) != 0 ||
992             (r = sshpkt_put_u8(ssh, wantconfirm)) != 0) {
993                 fatal_fr(r, "channel %i", c->self);
994         }
995 }
996
997 void
998 channel_register_status_confirm(struct ssh *ssh, int id,
999     channel_confirm_cb *cb, channel_confirm_abandon_cb *abandon_cb, void *ctx)
1000 {
1001         struct channel_confirm *cc;
1002         Channel *c;
1003
1004         if ((c = channel_lookup(ssh, id)) == NULL)
1005                 fatal_f("%d: bad id", id);
1006
1007         cc = xcalloc(1, sizeof(*cc));
1008         cc->cb = cb;
1009         cc->abandon_cb = abandon_cb;
1010         cc->ctx = ctx;
1011         TAILQ_INSERT_TAIL(&c->status_confirms, cc, entry);
1012 }
1013
1014 void
1015 channel_register_open_confirm(struct ssh *ssh, int id,
1016     channel_open_fn *fn, void *ctx)
1017 {
1018         Channel *c = channel_lookup(ssh, id);
1019
1020         if (c == NULL) {
1021                 logit_f("%d: bad id", id);
1022                 return;
1023         }
1024         c->open_confirm = fn;
1025         c->open_confirm_ctx = ctx;
1026 }
1027
1028 void
1029 channel_register_cleanup(struct ssh *ssh, int id,
1030     channel_callback_fn *fn, int do_close)
1031 {
1032         Channel *c = channel_by_id(ssh, id);
1033
1034         if (c == NULL) {
1035                 logit_f("%d: bad id", id);
1036                 return;
1037         }
1038         c->detach_user = fn;
1039         c->detach_close = do_close;
1040 }
1041
1042 void
1043 channel_cancel_cleanup(struct ssh *ssh, int id)
1044 {
1045         Channel *c = channel_by_id(ssh, id);
1046
1047         if (c == NULL) {
1048                 logit_f("%d: bad id", id);
1049                 return;
1050         }
1051         c->detach_user = NULL;
1052         c->detach_close = 0;
1053 }
1054
1055 void
1056 channel_register_filter(struct ssh *ssh, int id, channel_infilter_fn *ifn,
1057     channel_outfilter_fn *ofn, channel_filter_cleanup_fn *cfn, void *ctx)
1058 {
1059         Channel *c = channel_lookup(ssh, id);
1060
1061         if (c == NULL) {
1062                 logit_f("%d: bad id", id);
1063                 return;
1064         }
1065         c->input_filter = ifn;
1066         c->output_filter = ofn;
1067         c->filter_ctx = ctx;
1068         c->filter_cleanup = cfn;
1069 }
1070
1071 void
1072 channel_set_fds(struct ssh *ssh, int id, int rfd, int wfd, int efd,
1073     int extusage, int nonblock, int is_tty, u_int window_max)
1074 {
1075         Channel *c = channel_lookup(ssh, id);
1076         int r;
1077
1078         if (c == NULL || c->type != SSH_CHANNEL_LARVAL)
1079                 fatal("channel_activate for non-larval channel %d.", id);
1080         if (!c->have_remote_id)
1081                 fatal_f("channel %d: no remote id", c->self);
1082
1083         channel_register_fds(ssh, c, rfd, wfd, efd, extusage, nonblock, is_tty);
1084         c->type = SSH_CHANNEL_OPEN;
1085         c->local_window = c->local_window_max = window_max;
1086
1087         if ((r = sshpkt_start(ssh, SSH2_MSG_CHANNEL_WINDOW_ADJUST)) != 0 ||
1088             (r = sshpkt_put_u32(ssh, c->remote_id)) != 0 ||
1089             (r = sshpkt_put_u32(ssh, c->local_window)) != 0 ||
1090             (r = sshpkt_send(ssh)) != 0)
1091                 fatal_fr(r, "channel %i", c->self);
1092 }
1093
1094 static void
1095 channel_pre_listener(struct ssh *ssh, Channel *c)
1096 {
1097         c->io_want = SSH_CHAN_IO_SOCK_R;
1098 }
1099
1100 static void
1101 channel_pre_connecting(struct ssh *ssh, Channel *c)
1102 {
1103         debug3("channel %d: waiting for connection", c->self);
1104         c->io_want = SSH_CHAN_IO_SOCK_W;
1105 }
1106
1107 static void
1108 channel_pre_open(struct ssh *ssh, Channel *c)
1109 {
1110         c->io_want = 0;
1111         if (c->istate == CHAN_INPUT_OPEN &&
1112             c->remote_window > 0 &&
1113             sshbuf_len(c->input) < c->remote_window &&
1114             sshbuf_check_reserve(c->input, CHAN_RBUF) == 0)
1115                 c->io_want |= SSH_CHAN_IO_RFD;
1116         if (c->ostate == CHAN_OUTPUT_OPEN ||
1117             c->ostate == CHAN_OUTPUT_WAIT_DRAIN) {
1118                 if (sshbuf_len(c->output) > 0) {
1119                         c->io_want |= SSH_CHAN_IO_WFD;
1120                 } else if (c->ostate == CHAN_OUTPUT_WAIT_DRAIN) {
1121                         if (CHANNEL_EFD_OUTPUT_ACTIVE(c))
1122                                 debug2("channel %d: "
1123                                     "obuf_empty delayed efd %d/(%zu)", c->self,
1124                                     c->efd, sshbuf_len(c->extended));
1125                         else
1126                                 chan_obuf_empty(ssh, c);
1127                 }
1128         }
1129         /** XXX check close conditions, too */
1130         if (c->efd != -1 && !(c->istate == CHAN_INPUT_CLOSED &&
1131             c->ostate == CHAN_OUTPUT_CLOSED)) {
1132                 if (c->extended_usage == CHAN_EXTENDED_WRITE &&
1133                     sshbuf_len(c->extended) > 0)
1134                         c->io_want |= SSH_CHAN_IO_EFD_W;
1135                 else if (c->efd != -1 && !(c->flags & CHAN_EOF_SENT) &&
1136                     (c->extended_usage == CHAN_EXTENDED_READ ||
1137                     c->extended_usage == CHAN_EXTENDED_IGNORE) &&
1138                     sshbuf_len(c->extended) < c->remote_window)
1139                         c->io_want |= SSH_CHAN_IO_EFD_R;
1140         }
1141         /* XXX: What about efd? races? */
1142 }
1143
1144 /*
1145  * This is a special state for X11 authentication spoofing.  An opened X11
1146  * connection (when authentication spoofing is being done) remains in this
1147  * state until the first packet has been completely read.  The authentication
1148  * data in that packet is then substituted by the real data if it matches the
1149  * fake data, and the channel is put into normal mode.
1150  * XXX All this happens at the client side.
1151  * Returns: 0 = need more data, -1 = wrong cookie, 1 = ok
1152  */
1153 static int
1154 x11_open_helper(struct ssh *ssh, struct sshbuf *b)
1155 {
1156         struct ssh_channels *sc = ssh->chanctxt;
1157         u_char *ucp;
1158         u_int proto_len, data_len;
1159
1160         /* Is this being called after the refusal deadline? */
1161         if (sc->x11_refuse_time != 0 &&
1162             (u_int)monotime() >= sc->x11_refuse_time) {
1163                 verbose("Rejected X11 connection after ForwardX11Timeout "
1164                     "expired");
1165                 return -1;
1166         }
1167
1168         /* Check if the fixed size part of the packet is in buffer. */
1169         if (sshbuf_len(b) < 12)
1170                 return 0;
1171
1172         /* Parse the lengths of variable-length fields. */
1173         ucp = sshbuf_mutable_ptr(b);
1174         if (ucp[0] == 0x42) {   /* Byte order MSB first. */
1175                 proto_len = 256 * ucp[6] + ucp[7];
1176                 data_len = 256 * ucp[8] + ucp[9];
1177         } else if (ucp[0] == 0x6c) {    /* Byte order LSB first. */
1178                 proto_len = ucp[6] + 256 * ucp[7];
1179                 data_len = ucp[8] + 256 * ucp[9];
1180         } else {
1181                 debug2("Initial X11 packet contains bad byte order byte: 0x%x",
1182                     ucp[0]);
1183                 return -1;
1184         }
1185
1186         /* Check if the whole packet is in buffer. */
1187         if (sshbuf_len(b) <
1188             12 + ((proto_len + 3) & ~3) + ((data_len + 3) & ~3))
1189                 return 0;
1190
1191         /* Check if authentication protocol matches. */
1192         if (proto_len != strlen(sc->x11_saved_proto) ||
1193             memcmp(ucp + 12, sc->x11_saved_proto, proto_len) != 0) {
1194                 debug2("X11 connection uses different authentication protocol.");
1195                 return -1;
1196         }
1197         /* Check if authentication data matches our fake data. */
1198         if (data_len != sc->x11_fake_data_len ||
1199             timingsafe_bcmp(ucp + 12 + ((proto_len + 3) & ~3),
1200                 sc->x11_fake_data, sc->x11_fake_data_len) != 0) {
1201                 debug2("X11 auth data does not match fake data.");
1202                 return -1;
1203         }
1204         /* Check fake data length */
1205         if (sc->x11_fake_data_len != sc->x11_saved_data_len) {
1206                 error("X11 fake_data_len %d != saved_data_len %d",
1207                     sc->x11_fake_data_len, sc->x11_saved_data_len);
1208                 return -1;
1209         }
1210         /*
1211          * Received authentication protocol and data match
1212          * our fake data. Substitute the fake data with real
1213          * data.
1214          */
1215         memcpy(ucp + 12 + ((proto_len + 3) & ~3),
1216             sc->x11_saved_data, sc->x11_saved_data_len);
1217         return 1;
1218 }
1219
1220 static void
1221 channel_pre_x11_open(struct ssh *ssh, Channel *c)
1222 {
1223         int ret = x11_open_helper(ssh, c->output);
1224
1225         /* c->force_drain = 1; */
1226
1227         if (ret == 1) {
1228                 c->type = SSH_CHANNEL_OPEN;
1229                 channel_pre_open(ssh, c);
1230         } else if (ret == -1) {
1231                 logit("X11 connection rejected because of wrong authentication.");
1232                 debug2("X11 rejected %d i%d/o%d",
1233                     c->self, c->istate, c->ostate);
1234                 chan_read_failed(ssh, c);
1235                 sshbuf_reset(c->input);
1236                 chan_ibuf_empty(ssh, c);
1237                 sshbuf_reset(c->output);
1238                 chan_write_failed(ssh, c);
1239                 debug2("X11 closed %d i%d/o%d", c->self, c->istate, c->ostate);
1240         }
1241 }
1242
1243 static void
1244 channel_pre_mux_client(struct ssh *ssh, Channel *c)
1245 {
1246         c->io_want = 0;
1247         if (c->istate == CHAN_INPUT_OPEN && !c->mux_pause &&
1248             sshbuf_check_reserve(c->input, CHAN_RBUF) == 0)
1249                 c->io_want |= SSH_CHAN_IO_RFD;
1250         if (c->istate == CHAN_INPUT_WAIT_DRAIN) {
1251                 /* clear buffer immediately (discard any partial packet) */
1252                 sshbuf_reset(c->input);
1253                 chan_ibuf_empty(ssh, c);
1254                 /* Start output drain. XXX just kill chan? */
1255                 chan_rcvd_oclose(ssh, c);
1256         }
1257         if (c->ostate == CHAN_OUTPUT_OPEN ||
1258             c->ostate == CHAN_OUTPUT_WAIT_DRAIN) {
1259                 if (sshbuf_len(c->output) > 0)
1260                         c->io_want |= SSH_CHAN_IO_WFD;
1261                 else if (c->ostate == CHAN_OUTPUT_WAIT_DRAIN)
1262                         chan_obuf_empty(ssh, c);
1263         }
1264 }
1265
1266 /* try to decode a socks4 header */
1267 static int
1268 channel_decode_socks4(Channel *c, struct sshbuf *input, struct sshbuf *output)
1269 {
1270         const u_char *p;
1271         char *host;
1272         u_int len, have, i, found, need;
1273         char username[256];
1274         struct {
1275                 u_int8_t version;
1276                 u_int8_t command;
1277                 u_int16_t dest_port;
1278                 struct in_addr dest_addr;
1279         } s4_req, s4_rsp;
1280         int r;
1281
1282         debug2("channel %d: decode socks4", c->self);
1283
1284         have = sshbuf_len(input);
1285         len = sizeof(s4_req);
1286         if (have < len)
1287                 return 0;
1288         p = sshbuf_ptr(input);
1289
1290         need = 1;
1291         /* SOCKS4A uses an invalid IP address 0.0.0.x */
1292         if (p[4] == 0 && p[5] == 0 && p[6] == 0 && p[7] != 0) {
1293                 debug2("channel %d: socks4a request", c->self);
1294                 /* ... and needs an extra string (the hostname) */
1295                 need = 2;
1296         }
1297         /* Check for terminating NUL on the string(s) */
1298         for (found = 0, i = len; i < have; i++) {
1299                 if (p[i] == '\0') {
1300                         found++;
1301                         if (found == need)
1302                                 break;
1303                 }
1304                 if (i > 1024) {
1305                         /* the peer is probably sending garbage */
1306                         debug("channel %d: decode socks4: too long",
1307                             c->self);
1308                         return -1;
1309                 }
1310         }
1311         if (found < need)
1312                 return 0;
1313         if ((r = sshbuf_get(input, &s4_req.version, 1)) != 0 ||
1314             (r = sshbuf_get(input, &s4_req.command, 1)) != 0 ||
1315             (r = sshbuf_get(input, &s4_req.dest_port, 2)) != 0 ||
1316             (r = sshbuf_get(input, &s4_req.dest_addr, 4)) != 0) {
1317                 debug_r(r, "channels %d: decode socks4", c->self);
1318                 return -1;
1319         }
1320         have = sshbuf_len(input);
1321         p = sshbuf_ptr(input);
1322         if (memchr(p, '\0', have) == NULL) {
1323                 error("channel %d: decode socks4: unterminated user", c->self);
1324                 return -1;
1325         }
1326         len = strlen(p);
1327         debug2("channel %d: decode socks4: user %s/%d", c->self, p, len);
1328         len++; /* trailing '\0' */
1329         strlcpy(username, p, sizeof(username));
1330         if ((r = sshbuf_consume(input, len)) != 0)
1331                 fatal_fr(r, "channel %d: consume", c->self);
1332         free(c->path);
1333         c->path = NULL;
1334         if (need == 1) {                        /* SOCKS4: one string */
1335                 host = inet_ntoa(s4_req.dest_addr);
1336                 c->path = xstrdup(host);
1337         } else {                                /* SOCKS4A: two strings */
1338                 have = sshbuf_len(input);
1339                 p = sshbuf_ptr(input);
1340                 if (memchr(p, '\0', have) == NULL) {
1341                         error("channel %d: decode socks4a: host not nul "
1342                             "terminated", c->self);
1343                         return -1;
1344                 }
1345                 len = strlen(p);
1346                 debug2("channel %d: decode socks4a: host %s/%d",
1347                     c->self, p, len);
1348                 len++;                          /* trailing '\0' */
1349                 if (len > NI_MAXHOST) {
1350                         error("channel %d: hostname \"%.100s\" too long",
1351                             c->self, p);
1352                         return -1;
1353                 }
1354                 c->path = xstrdup(p);
1355                 if ((r = sshbuf_consume(input, len)) != 0)
1356                         fatal_fr(r, "channel %d: consume", c->self);
1357         }
1358         c->host_port = ntohs(s4_req.dest_port);
1359
1360         debug2("channel %d: dynamic request: socks4 host %s port %u command %u",
1361             c->self, c->path, c->host_port, s4_req.command);
1362
1363         if (s4_req.command != 1) {
1364                 debug("channel %d: cannot handle: %s cn %d",
1365                     c->self, need == 1 ? "SOCKS4" : "SOCKS4A", s4_req.command);
1366                 return -1;
1367         }
1368         s4_rsp.version = 0;                     /* vn: 0 for reply */
1369         s4_rsp.command = 90;                    /* cd: req granted */
1370         s4_rsp.dest_port = 0;                   /* ignored */
1371         s4_rsp.dest_addr.s_addr = INADDR_ANY;   /* ignored */
1372         if ((r = sshbuf_put(output, &s4_rsp, sizeof(s4_rsp))) != 0)
1373                 fatal_fr(r, "channel %d: append reply", c->self);
1374         return 1;
1375 }
1376
1377 /* try to decode a socks5 header */
1378 #define SSH_SOCKS5_AUTHDONE     0x1000
1379 #define SSH_SOCKS5_NOAUTH       0x00
1380 #define SSH_SOCKS5_IPV4         0x01
1381 #define SSH_SOCKS5_DOMAIN       0x03
1382 #define SSH_SOCKS5_IPV6         0x04
1383 #define SSH_SOCKS5_CONNECT      0x01
1384 #define SSH_SOCKS5_SUCCESS      0x00
1385
1386 static int
1387 channel_decode_socks5(Channel *c, struct sshbuf *input, struct sshbuf *output)
1388 {
1389         /* XXX use get/put_u8 instead of trusting struct padding */
1390         struct {
1391                 u_int8_t version;
1392                 u_int8_t command;
1393                 u_int8_t reserved;
1394                 u_int8_t atyp;
1395         } s5_req, s5_rsp;
1396         u_int16_t dest_port;
1397         char dest_addr[255+1], ntop[INET6_ADDRSTRLEN];
1398         const u_char *p;
1399         u_int have, need, i, found, nmethods, addrlen, af;
1400         int r;
1401
1402         debug2("channel %d: decode socks5", c->self);
1403         p = sshbuf_ptr(input);
1404         if (p[0] != 0x05)
1405                 return -1;
1406         have = sshbuf_len(input);
1407         if (!(c->flags & SSH_SOCKS5_AUTHDONE)) {
1408                 /* format: ver | nmethods | methods */
1409                 if (have < 2)
1410                         return 0;
1411                 nmethods = p[1];
1412                 if (have < nmethods + 2)
1413                         return 0;
1414                 /* look for method: "NO AUTHENTICATION REQUIRED" */
1415                 for (found = 0, i = 2; i < nmethods + 2; i++) {
1416                         if (p[i] == SSH_SOCKS5_NOAUTH) {
1417                                 found = 1;
1418                                 break;
1419                         }
1420                 }
1421                 if (!found) {
1422                         debug("channel %d: method SSH_SOCKS5_NOAUTH not found",
1423                             c->self);
1424                         return -1;
1425                 }
1426                 if ((r = sshbuf_consume(input, nmethods + 2)) != 0)
1427                         fatal_fr(r, "channel %d: consume", c->self);
1428                 /* version, method */
1429                 if ((r = sshbuf_put_u8(output, 0x05)) != 0 ||
1430                     (r = sshbuf_put_u8(output, SSH_SOCKS5_NOAUTH)) != 0)
1431                         fatal_fr(r, "channel %d: append reply", c->self);
1432                 c->flags |= SSH_SOCKS5_AUTHDONE;
1433                 debug2("channel %d: socks5 auth done", c->self);
1434                 return 0;                               /* need more */
1435         }
1436         debug2("channel %d: socks5 post auth", c->self);
1437         if (have < sizeof(s5_req)+1)
1438                 return 0;                       /* need more */
1439         memcpy(&s5_req, p, sizeof(s5_req));
1440         if (s5_req.version != 0x05 ||
1441             s5_req.command != SSH_SOCKS5_CONNECT ||
1442             s5_req.reserved != 0x00) {
1443                 debug2("channel %d: only socks5 connect supported", c->self);
1444                 return -1;
1445         }
1446         switch (s5_req.atyp){
1447         case SSH_SOCKS5_IPV4:
1448                 addrlen = 4;
1449                 af = AF_INET;
1450                 break;
1451         case SSH_SOCKS5_DOMAIN:
1452                 addrlen = p[sizeof(s5_req)];
1453                 af = -1;
1454                 break;
1455         case SSH_SOCKS5_IPV6:
1456                 addrlen = 16;
1457                 af = AF_INET6;
1458                 break;
1459         default:
1460                 debug2("channel %d: bad socks5 atyp %d", c->self, s5_req.atyp);
1461                 return -1;
1462         }
1463         need = sizeof(s5_req) + addrlen + 2;
1464         if (s5_req.atyp == SSH_SOCKS5_DOMAIN)
1465                 need++;
1466         if (have < need)
1467                 return 0;
1468         if ((r = sshbuf_consume(input, sizeof(s5_req))) != 0)
1469                 fatal_fr(r, "channel %d: consume", c->self);
1470         if (s5_req.atyp == SSH_SOCKS5_DOMAIN) {
1471                 /* host string length */
1472                 if ((r = sshbuf_consume(input, 1)) != 0)
1473                         fatal_fr(r, "channel %d: consume", c->self);
1474         }
1475         if ((r = sshbuf_get(input, &dest_addr, addrlen)) != 0 ||
1476             (r = sshbuf_get(input, &dest_port, 2)) != 0) {
1477                 debug_r(r, "channel %d: parse addr/port", c->self);
1478                 return -1;
1479         }
1480         dest_addr[addrlen] = '\0';
1481         free(c->path);
1482         c->path = NULL;
1483         if (s5_req.atyp == SSH_SOCKS5_DOMAIN) {
1484                 if (addrlen >= NI_MAXHOST) {
1485                         error("channel %d: dynamic request: socks5 hostname "
1486                             "\"%.100s\" too long", c->self, dest_addr);
1487                         return -1;
1488                 }
1489                 c->path = xstrdup(dest_addr);
1490         } else {
1491                 if (inet_ntop(af, dest_addr, ntop, sizeof(ntop)) == NULL)
1492                         return -1;
1493                 c->path = xstrdup(ntop);
1494         }
1495         c->host_port = ntohs(dest_port);
1496
1497         debug2("channel %d: dynamic request: socks5 host %s port %u command %u",
1498             c->self, c->path, c->host_port, s5_req.command);
1499
1500         s5_rsp.version = 0x05;
1501         s5_rsp.command = SSH_SOCKS5_SUCCESS;
1502         s5_rsp.reserved = 0;                    /* ignored */
1503         s5_rsp.atyp = SSH_SOCKS5_IPV4;
1504         dest_port = 0;                          /* ignored */
1505
1506         if ((r = sshbuf_put(output, &s5_rsp, sizeof(s5_rsp))) != 0 ||
1507             (r = sshbuf_put_u32(output, ntohl(INADDR_ANY))) != 0 ||
1508             (r = sshbuf_put(output, &dest_port, sizeof(dest_port))) != 0)
1509                 fatal_fr(r, "channel %d: append reply", c->self);
1510         return 1;
1511 }
1512
1513 Channel *
1514 channel_connect_stdio_fwd(struct ssh *ssh,
1515     const char *host_to_connect, u_short port_to_connect,
1516     int in, int out, int nonblock)
1517 {
1518         Channel *c;
1519
1520         debug_f("%s:%d", host_to_connect, port_to_connect);
1521
1522         c = channel_new(ssh, "stdio-forward", SSH_CHANNEL_OPENING, in, out,
1523             -1, CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT,
1524             0, "stdio-forward", nonblock);
1525
1526         c->path = xstrdup(host_to_connect);
1527         c->host_port = port_to_connect;
1528         c->listening_port = 0;
1529         c->force_drain = 1;
1530
1531         channel_register_fds(ssh, c, in, out, -1, 0, 1, 0);
1532         port_open_helper(ssh, c, "direct-tcpip");
1533
1534         return c;
1535 }
1536
1537 /* dynamic port forwarding */
1538 static void
1539 channel_pre_dynamic(struct ssh *ssh, Channel *c)
1540 {
1541         const u_char *p;
1542         u_int have;
1543         int ret;
1544
1545         c->io_want = 0;
1546         have = sshbuf_len(c->input);
1547         debug2("channel %d: pre_dynamic: have %d", c->self, have);
1548         /* sshbuf_dump(c->input, stderr); */
1549         /* check if the fixed size part of the packet is in buffer. */
1550         if (have < 3) {
1551                 /* need more */
1552                 c->io_want |= SSH_CHAN_IO_RFD;
1553                 return;
1554         }
1555         /* try to guess the protocol */
1556         p = sshbuf_ptr(c->input);
1557         /* XXX sshbuf_peek_u8? */
1558         switch (p[0]) {
1559         case 0x04:
1560                 ret = channel_decode_socks4(c, c->input, c->output);
1561                 break;
1562         case 0x05:
1563                 ret = channel_decode_socks5(c, c->input, c->output);
1564                 break;
1565         default:
1566                 ret = -1;
1567                 break;
1568         }
1569         if (ret < 0) {
1570                 chan_mark_dead(ssh, c);
1571         } else if (ret == 0) {
1572                 debug2("channel %d: pre_dynamic: need more", c->self);
1573                 /* need more */
1574                 c->io_want |= SSH_CHAN_IO_RFD;
1575                 if (sshbuf_len(c->output))
1576                         c->io_want |= SSH_CHAN_IO_WFD;
1577         } else {
1578                 /* switch to the next state */
1579                 c->type = SSH_CHANNEL_OPENING;
1580                 port_open_helper(ssh, c, "direct-tcpip");
1581         }
1582 }
1583
1584 /* simulate read-error */
1585 static void
1586 rdynamic_close(struct ssh *ssh, Channel *c)
1587 {
1588         c->type = SSH_CHANNEL_OPEN;
1589         chan_read_failed(ssh, c);
1590         sshbuf_reset(c->input);
1591         chan_ibuf_empty(ssh, c);
1592         sshbuf_reset(c->output);
1593         chan_write_failed(ssh, c);
1594 }
1595
1596 /* reverse dynamic port forwarding */
1597 static void
1598 channel_before_prepare_io_rdynamic(struct ssh *ssh, Channel *c)
1599 {
1600         const u_char *p;
1601         u_int have, len;
1602         int r, ret;
1603
1604         have = sshbuf_len(c->output);
1605         debug2("channel %d: pre_rdynamic: have %d", c->self, have);
1606         /* sshbuf_dump(c->output, stderr); */
1607         /* EOF received */
1608         if (c->flags & CHAN_EOF_RCVD) {
1609                 if ((r = sshbuf_consume(c->output, have)) != 0)
1610                         fatal_fr(r, "channel %d: consume", c->self);
1611                 rdynamic_close(ssh, c);
1612                 return;
1613         }
1614         /* check if the fixed size part of the packet is in buffer. */
1615         if (have < 3)
1616                 return;
1617         /* try to guess the protocol */
1618         p = sshbuf_ptr(c->output);
1619         switch (p[0]) {
1620         case 0x04:
1621                 /* switch input/output for reverse forwarding */
1622                 ret = channel_decode_socks4(c, c->output, c->input);
1623                 break;
1624         case 0x05:
1625                 ret = channel_decode_socks5(c, c->output, c->input);
1626                 break;
1627         default:
1628                 ret = -1;
1629                 break;
1630         }
1631         if (ret < 0) {
1632                 rdynamic_close(ssh, c);
1633         } else if (ret == 0) {
1634                 debug2("channel %d: pre_rdynamic: need more", c->self);
1635                 /* send socks request to peer */
1636                 len = sshbuf_len(c->input);
1637                 if (len > 0 && len < c->remote_window) {
1638                         if ((r = sshpkt_start(ssh, SSH2_MSG_CHANNEL_DATA)) != 0 ||
1639                             (r = sshpkt_put_u32(ssh, c->remote_id)) != 0 ||
1640                             (r = sshpkt_put_stringb(ssh, c->input)) != 0 ||
1641                             (r = sshpkt_send(ssh)) != 0) {
1642                                 fatal_fr(r, "channel %i: rdynamic", c->self);
1643                         }
1644                         if ((r = sshbuf_consume(c->input, len)) != 0)
1645                                 fatal_fr(r, "channel %d: consume", c->self);
1646                         c->remote_window -= len;
1647                 }
1648         } else if (rdynamic_connect_finish(ssh, c) < 0) {
1649                 /* the connect failed */
1650                 rdynamic_close(ssh, c);
1651         }
1652 }
1653
1654 /* This is our fake X11 server socket. */
1655 static void
1656 channel_post_x11_listener(struct ssh *ssh, Channel *c)
1657 {
1658         Channel *nc;
1659         struct sockaddr_storage addr;
1660         int r, newsock, oerrno, remote_port;
1661         socklen_t addrlen;
1662         char buf[16384], *remote_ipaddr;
1663
1664         if ((c->io_ready & SSH_CHAN_IO_SOCK_R) == 0)
1665                 return;
1666
1667         debug("X11 connection requested.");
1668         addrlen = sizeof(addr);
1669         newsock = accept(c->sock, (struct sockaddr *)&addr, &addrlen);
1670         if (c->single_connection) {
1671                 oerrno = errno;
1672                 debug2("single_connection: closing X11 listener.");
1673                 channel_close_fd(ssh, c, &c->sock);
1674                 chan_mark_dead(ssh, c);
1675                 errno = oerrno;
1676         }
1677         if (newsock == -1) {
1678                 if (errno != EINTR && errno != EWOULDBLOCK &&
1679                     errno != ECONNABORTED)
1680                         error("accept: %.100s", strerror(errno));
1681                 if (errno == EMFILE || errno == ENFILE)
1682                         c->notbefore = monotime() + 1;
1683                 return;
1684         }
1685         set_nodelay(newsock);
1686         remote_ipaddr = get_peer_ipaddr(newsock);
1687         remote_port = get_peer_port(newsock);
1688         snprintf(buf, sizeof buf, "X11 connection from %.200s port %d",
1689             remote_ipaddr, remote_port);
1690
1691         nc = channel_new(ssh, "accepted x11 socket",
1692             SSH_CHANNEL_OPENING, newsock, newsock, -1,
1693             c->local_window_max, c->local_maxpacket, 0, buf, 1);
1694         open_preamble(ssh, __func__, nc, "x11");
1695         if ((r = sshpkt_put_cstring(ssh, remote_ipaddr)) != 0 ||
1696             (r = sshpkt_put_u32(ssh, remote_port)) != 0) {
1697                 fatal_fr(r, "channel %i: reply", c->self);
1698         }
1699         if ((r = sshpkt_send(ssh)) != 0)
1700                 fatal_fr(r, "channel %i: send", c->self);
1701         free(remote_ipaddr);
1702 }
1703
1704 static void
1705 port_open_helper(struct ssh *ssh, Channel *c, char *rtype)
1706 {
1707         char *local_ipaddr = get_local_ipaddr(c->sock);
1708         int local_port = c->sock == -1 ? 65536 : get_local_port(c->sock);
1709         char *remote_ipaddr = get_peer_ipaddr(c->sock);
1710         int remote_port = get_peer_port(c->sock);
1711         int r;
1712
1713         if (remote_port == -1) {
1714                 /* Fake addr/port to appease peers that validate it (Tectia) */
1715                 free(remote_ipaddr);
1716                 remote_ipaddr = xstrdup("127.0.0.1");
1717                 remote_port = 65535;
1718         }
1719
1720         free(c->remote_name);
1721         xasprintf(&c->remote_name,
1722             "%s: listening port %d for %.100s port %d, "
1723             "connect from %.200s port %d to %.100s port %d",
1724             rtype, c->listening_port, c->path, c->host_port,
1725             remote_ipaddr, remote_port, local_ipaddr, local_port);
1726
1727         open_preamble(ssh, __func__, c, rtype);
1728         if (strcmp(rtype, "direct-tcpip") == 0) {
1729                 /* target host, port */
1730                 if ((r = sshpkt_put_cstring(ssh, c->path)) != 0 ||
1731                     (r = sshpkt_put_u32(ssh, c->host_port)) != 0)
1732                         fatal_fr(r, "channel %i: reply", c->self);
1733         } else if (strcmp(rtype, "direct-streamlocal@openssh.com") == 0) {
1734                 /* target path */
1735                 if ((r = sshpkt_put_cstring(ssh, c->path)) != 0)
1736                         fatal_fr(r, "channel %i: reply", c->self);
1737         } else if (strcmp(rtype, "forwarded-streamlocal@openssh.com") == 0) {
1738                 /* listen path */
1739                 if ((r = sshpkt_put_cstring(ssh, c->path)) != 0)
1740                         fatal_fr(r, "channel %i: reply", c->self);
1741         } else {
1742                 /* listen address, port */
1743                 if ((r = sshpkt_put_cstring(ssh, c->path)) != 0 ||
1744                     (r = sshpkt_put_u32(ssh, local_port)) != 0)
1745                         fatal_fr(r, "channel %i: reply", c->self);
1746         }
1747         if (strcmp(rtype, "forwarded-streamlocal@openssh.com") == 0) {
1748                 /* reserved for future owner/mode info */
1749                 if ((r = sshpkt_put_cstring(ssh, "")) != 0)
1750                         fatal_fr(r, "channel %i: reply", c->self);
1751         } else {
1752                 /* originator host and port */
1753                 if ((r = sshpkt_put_cstring(ssh, remote_ipaddr)) != 0 ||
1754                     (r = sshpkt_put_u32(ssh, (u_int)remote_port)) != 0)
1755                         fatal_fr(r, "channel %i: reply", c->self);
1756         }
1757         if ((r = sshpkt_send(ssh)) != 0)
1758                 fatal_fr(r, "channel %i: send", c->self);
1759         free(remote_ipaddr);
1760         free(local_ipaddr);
1761 }
1762
1763 void
1764 channel_set_x11_refuse_time(struct ssh *ssh, u_int refuse_time)
1765 {
1766         ssh->chanctxt->x11_refuse_time = refuse_time;
1767 }
1768
1769 /*
1770  * This socket is listening for connections to a forwarded TCP/IP port.
1771  */
1772 static void
1773 channel_post_port_listener(struct ssh *ssh, Channel *c)
1774 {
1775         Channel *nc;
1776         struct sockaddr_storage addr;
1777         int newsock, nextstate;
1778         socklen_t addrlen;
1779         char *rtype;
1780
1781         if ((c->io_ready & SSH_CHAN_IO_SOCK_R) == 0)
1782                 return;
1783
1784         debug("Connection to port %d forwarding to %.100s port %d requested.",
1785             c->listening_port, c->path, c->host_port);
1786
1787         if (c->type == SSH_CHANNEL_RPORT_LISTENER) {
1788                 nextstate = SSH_CHANNEL_OPENING;
1789                 rtype = "forwarded-tcpip";
1790         } else if (c->type == SSH_CHANNEL_RUNIX_LISTENER) {
1791                 nextstate = SSH_CHANNEL_OPENING;
1792                 rtype = "forwarded-streamlocal@openssh.com";
1793         } else if (c->host_port == PORT_STREAMLOCAL) {
1794                 nextstate = SSH_CHANNEL_OPENING;
1795                 rtype = "direct-streamlocal@openssh.com";
1796         } else if (c->host_port == 0) {
1797                 nextstate = SSH_CHANNEL_DYNAMIC;
1798                 rtype = "dynamic-tcpip";
1799         } else {
1800                 nextstate = SSH_CHANNEL_OPENING;
1801                 rtype = "direct-tcpip";
1802         }
1803
1804         addrlen = sizeof(addr);
1805         newsock = accept(c->sock, (struct sockaddr *)&addr, &addrlen);
1806         if (newsock == -1) {
1807                 if (errno != EINTR && errno != EWOULDBLOCK &&
1808                     errno != ECONNABORTED)
1809                         error("accept: %.100s", strerror(errno));
1810                 if (errno == EMFILE || errno == ENFILE)
1811                         c->notbefore = monotime() + 1;
1812                 return;
1813         }
1814         if (c->host_port != PORT_STREAMLOCAL)
1815                 set_nodelay(newsock);
1816         nc = channel_new(ssh, rtype, nextstate, newsock, newsock, -1,
1817             c->local_window_max, c->local_maxpacket, 0, rtype, 1);
1818         nc->listening_port = c->listening_port;
1819         nc->host_port = c->host_port;
1820         if (c->path != NULL)
1821                 nc->path = xstrdup(c->path);
1822
1823         if (nextstate != SSH_CHANNEL_DYNAMIC)
1824                 port_open_helper(ssh, nc, rtype);
1825 }
1826
1827 /*
1828  * This is the authentication agent socket listening for connections from
1829  * clients.
1830  */
1831 static void
1832 channel_post_auth_listener(struct ssh *ssh, Channel *c)
1833 {
1834         Channel *nc;
1835         int r, newsock;
1836         struct sockaddr_storage addr;
1837         socklen_t addrlen;
1838
1839         if ((c->io_ready & SSH_CHAN_IO_SOCK_R) == 0)
1840                 return;
1841
1842         addrlen = sizeof(addr);
1843         newsock = accept(c->sock, (struct sockaddr *)&addr, &addrlen);
1844         if (newsock == -1) {
1845                 error("accept from auth socket: %.100s", strerror(errno));
1846                 if (errno == EMFILE || errno == ENFILE)
1847                         c->notbefore = monotime() + 1;
1848                 return;
1849         }
1850         nc = channel_new(ssh, "accepted auth socket",
1851             SSH_CHANNEL_OPENING, newsock, newsock, -1,
1852             c->local_window_max, c->local_maxpacket,
1853             0, "accepted auth socket", 1);
1854         open_preamble(ssh, __func__, nc, "auth-agent@openssh.com");
1855         if ((r = sshpkt_send(ssh)) != 0)
1856                 fatal_fr(r, "channel %i", c->self);
1857 }
1858
1859 static void
1860 channel_post_connecting(struct ssh *ssh, Channel *c)
1861 {
1862         int err = 0, sock, isopen, r;
1863         socklen_t sz = sizeof(err);
1864
1865         if ((c->io_ready & SSH_CHAN_IO_SOCK_W) == 0)
1866                 return;
1867         if (!c->have_remote_id)
1868                 fatal_f("channel %d: no remote id", c->self);
1869         /* for rdynamic the OPEN_CONFIRMATION has been sent already */
1870         isopen = (c->type == SSH_CHANNEL_RDYNAMIC_FINISH);
1871         if (getsockopt(c->sock, SOL_SOCKET, SO_ERROR, &err, &sz) == -1) {
1872                 err = errno;
1873                 error("getsockopt SO_ERROR failed");
1874         }
1875         if (err == 0) {
1876                 debug("channel %d: connected to %s port %d",
1877                     c->self, c->connect_ctx.host, c->connect_ctx.port);
1878                 channel_connect_ctx_free(&c->connect_ctx);
1879                 c->type = SSH_CHANNEL_OPEN;
1880                 if (isopen) {
1881                         /* no message necessary */
1882                 } else {
1883                         if ((r = sshpkt_start(ssh,
1884                             SSH2_MSG_CHANNEL_OPEN_CONFIRMATION)) != 0 ||
1885                             (r = sshpkt_put_u32(ssh, c->remote_id)) != 0 ||
1886                             (r = sshpkt_put_u32(ssh, c->self)) != 0 ||
1887                             (r = sshpkt_put_u32(ssh, c->local_window)) != 0 ||
1888                             (r = sshpkt_put_u32(ssh, c->local_maxpacket)) != 0 ||
1889                             (r = sshpkt_send(ssh)) != 0)
1890                                 fatal_fr(r, "channel %i open confirm", c->self);
1891                 }
1892         } else {
1893                 debug("channel %d: connection failed: %s",
1894                     c->self, strerror(err));
1895                 /* Try next address, if any */
1896                 if ((sock = connect_next(&c->connect_ctx)) > 0) {
1897                         close(c->sock);
1898                         c->sock = c->rfd = c->wfd = sock;
1899                         return;
1900                 }
1901                 /* Exhausted all addresses */
1902                 error("connect_to %.100s port %d: failed.",
1903                     c->connect_ctx.host, c->connect_ctx.port);
1904                 channel_connect_ctx_free(&c->connect_ctx);
1905                 if (isopen) {
1906                         rdynamic_close(ssh, c);
1907                 } else {
1908                         if ((r = sshpkt_start(ssh,
1909                             SSH2_MSG_CHANNEL_OPEN_FAILURE)) != 0 ||
1910                             (r = sshpkt_put_u32(ssh, c->remote_id)) != 0 ||
1911                             (r = sshpkt_put_u32(ssh,
1912                             SSH2_OPEN_CONNECT_FAILED)) != 0 ||
1913                             (r = sshpkt_put_cstring(ssh, strerror(err))) != 0 ||
1914                             (r = sshpkt_put_cstring(ssh, "")) != 0 ||
1915                             (r = sshpkt_send(ssh)) != 0)
1916                                 fatal_fr(r, "channel %i: failure", c->self);
1917                         chan_mark_dead(ssh, c);
1918                 }
1919         }
1920 }
1921
1922 static int
1923 channel_handle_rfd(struct ssh *ssh, Channel *c)
1924 {
1925         char buf[CHAN_RBUF];
1926         ssize_t len;
1927         int r, force;
1928         size_t have, avail, maxlen = CHANNEL_MAX_READ;
1929         int pty_zeroread = 0;
1930
1931 #ifdef PTY_ZEROREAD
1932         /* Bug on AIX: read(1) can return 0 for a non-closed fd */
1933         pty_zeroread = c->isatty;
1934 #endif
1935
1936         force = c->isatty && c->detach_close && c->istate != CHAN_INPUT_CLOSED;
1937
1938         if (!force && (c->io_ready & SSH_CHAN_IO_RFD) == 0)
1939                 return 1;
1940         if ((avail = sshbuf_avail(c->input)) == 0)
1941                 return 1; /* Shouldn't happen */
1942
1943         /*
1944          * For "simple" channels (i.e. not datagram or filtered), we can
1945          * read directly to the channel buffer.
1946          */
1947         if (!pty_zeroread && c->input_filter == NULL && !c->datagram) {
1948                 /* Only OPEN channels have valid rwin */
1949                 if (c->type == SSH_CHANNEL_OPEN) {
1950                         if ((have = sshbuf_len(c->input)) >= c->remote_window)
1951                                 return 1; /* shouldn't happen */
1952                         if (maxlen > c->remote_window - have)
1953                                 maxlen = c->remote_window - have;
1954                 }
1955                 if (maxlen > avail)
1956                         maxlen = avail;
1957                 if ((r = sshbuf_read(c->rfd, c->input, maxlen, NULL)) != 0) {
1958                         if (errno == EINTR || (!force &&
1959                             (errno == EAGAIN || errno == EWOULDBLOCK)))
1960                                 return 1;
1961                         debug2("channel %d: read failed rfd %d maxlen %zu: %s",
1962                             c->self, c->rfd, maxlen, ssh_err(r));
1963                         goto rfail;
1964                 }
1965                 return 1;
1966         }
1967
1968         errno = 0;
1969         len = read(c->rfd, buf, sizeof(buf));
1970         /* fixup AIX zero-length read with errno set to look more like errors */
1971         if (pty_zeroread && len == 0 && errno != 0)
1972                 len = -1;
1973         if (len == -1 && (errno == EINTR ||
1974             ((errno == EAGAIN || errno == EWOULDBLOCK) && !force)))
1975                 return 1;
1976         if (len < 0 || (!pty_zeroread && len == 0)) {
1977                 debug2("channel %d: read<=0 rfd %d len %zd: %s",
1978                     c->self, c->rfd, len,
1979                     len == 0 ? "closed" : strerror(errno));
1980  rfail:
1981                 if (c->type != SSH_CHANNEL_OPEN) {
1982                         debug2("channel %d: not open", c->self);
1983                         chan_mark_dead(ssh, c);
1984                         return -1;
1985                 } else {
1986                         chan_read_failed(ssh, c);
1987                 }
1988                 return -1;
1989         }
1990         if (c->input_filter != NULL) {
1991                 if (c->input_filter(ssh, c, buf, len) == -1) {
1992                         debug2("channel %d: filter stops", c->self);
1993                         chan_read_failed(ssh, c);
1994                 }
1995         } else if (c->datagram) {
1996                 if ((r = sshbuf_put_string(c->input, buf, len)) != 0)
1997                         fatal_fr(r, "channel %i: put datagram", c->self);
1998         } else if ((r = sshbuf_put(c->input, buf, len)) != 0)
1999                 fatal_fr(r, "channel %i: put data", c->self);
2000
2001         return 1;
2002 }
2003
2004 static int
2005 channel_handle_wfd(struct ssh *ssh, Channel *c)
2006 {
2007         struct termios tio;
2008         u_char *data = NULL, *buf; /* XXX const; need filter API change */
2009         size_t dlen, olen = 0;
2010         int r, len;
2011
2012         if ((c->io_ready & SSH_CHAN_IO_WFD) == 0)
2013                 return 1;
2014         if (sshbuf_len(c->output) == 0)
2015                 return 1;
2016
2017         /* Send buffered output data to the socket. */
2018         olen = sshbuf_len(c->output);
2019         if (c->output_filter != NULL) {
2020                 if ((buf = c->output_filter(ssh, c, &data, &dlen)) == NULL) {
2021                         debug2("channel %d: filter stops", c->self);
2022                         if (c->type != SSH_CHANNEL_OPEN)
2023                                 chan_mark_dead(ssh, c);
2024                         else
2025                                 chan_write_failed(ssh, c);
2026                         return -1;
2027                 }
2028         } else if (c->datagram) {
2029                 if ((r = sshbuf_get_string(c->output, &data, &dlen)) != 0)
2030                         fatal_fr(r, "channel %i: get datagram", c->self);
2031                 buf = data;
2032         } else {
2033                 buf = data = sshbuf_mutable_ptr(c->output);
2034                 dlen = sshbuf_len(c->output);
2035         }
2036
2037         if (c->datagram) {
2038                 /* ignore truncated writes, datagrams might get lost */
2039                 len = write(c->wfd, buf, dlen);
2040                 free(data);
2041                 if (len == -1 && (errno == EINTR || errno == EAGAIN ||
2042                     errno == EWOULDBLOCK))
2043                         return 1;
2044                 if (len <= 0)
2045                         goto write_fail;
2046                 goto out;
2047         }
2048
2049 #ifdef _AIX
2050         /* XXX: Later AIX versions can't push as much data to tty */
2051         if (c->wfd_isatty)
2052                 dlen = MINIMUM(dlen, 8*1024);
2053 #endif
2054
2055         len = write(c->wfd, buf, dlen);
2056         if (len == -1 &&
2057             (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK))
2058                 return 1;
2059         if (len <= 0) {
2060  write_fail:
2061                 if (c->type != SSH_CHANNEL_OPEN) {
2062                         debug2("channel %d: not open", c->self);
2063                         chan_mark_dead(ssh, c);
2064                         return -1;
2065                 } else {
2066                         chan_write_failed(ssh, c);
2067                 }
2068                 return -1;
2069         }
2070 #ifndef BROKEN_TCGETATTR_ICANON
2071         if (c->isatty && dlen >= 1 && buf[0] != '\r') {
2072                 if (tcgetattr(c->wfd, &tio) == 0 &&
2073                     !(tio.c_lflag & ECHO) && (tio.c_lflag & ICANON)) {
2074                         /*
2075                          * Simulate echo to reduce the impact of
2076                          * traffic analysis. We need to match the
2077                          * size of a SSH2_MSG_CHANNEL_DATA message
2078                          * (4 byte channel id + buf)
2079                          */
2080                         if ((r = sshpkt_msg_ignore(ssh, 4+len)) != 0 ||
2081                             (r = sshpkt_send(ssh)) != 0)
2082                                 fatal_fr(r, "channel %i: ignore", c->self);
2083                 }
2084         }
2085 #endif /* BROKEN_TCGETATTR_ICANON */
2086         if ((r = sshbuf_consume(c->output, len)) != 0)
2087                 fatal_fr(r, "channel %i: consume", c->self);
2088  out:
2089         c->local_consumed += olen - sshbuf_len(c->output);
2090
2091         return 1;
2092 }
2093
2094 static int
2095 channel_handle_efd_write(struct ssh *ssh, Channel *c)
2096 {
2097         int r;
2098         ssize_t len;
2099
2100         if ((c->io_ready & SSH_CHAN_IO_EFD_W) == 0)
2101                 return 1;
2102         if (sshbuf_len(c->extended) == 0)
2103                 return 1;
2104
2105         len = write(c->efd, sshbuf_ptr(c->extended),
2106             sshbuf_len(c->extended));
2107         debug2("channel %d: written %zd to efd %d", c->self, len, c->efd);
2108         if (len == -1 && (errno == EINTR || errno == EAGAIN ||
2109             errno == EWOULDBLOCK))
2110                 return 1;
2111         if (len <= 0) {
2112                 debug2("channel %d: closing write-efd %d", c->self, c->efd);
2113                 channel_close_fd(ssh, c, &c->efd);
2114         } else {
2115                 if ((r = sshbuf_consume(c->extended, len)) != 0)
2116                         fatal_fr(r, "channel %i: consume", c->self);
2117                 c->local_consumed += len;
2118         }
2119         return 1;
2120 }
2121
2122 static int
2123 channel_handle_efd_read(struct ssh *ssh, Channel *c)
2124 {
2125         char buf[CHAN_RBUF];
2126         ssize_t len;
2127         int r, force;
2128
2129         force = c->isatty && c->detach_close && c->istate != CHAN_INPUT_CLOSED;
2130
2131         if (!force && (c->io_ready & SSH_CHAN_IO_EFD_R) == 0)
2132                 return 1;
2133
2134         len = read(c->efd, buf, sizeof(buf));
2135         debug2("channel %d: read %zd from efd %d", c->self, len, c->efd);
2136         if (len == -1 && (errno == EINTR || ((errno == EAGAIN ||
2137             errno == EWOULDBLOCK) && !force)))
2138                 return 1;
2139         if (len <= 0) {
2140                 debug2("channel %d: closing read-efd %d", c->self, c->efd);
2141                 channel_close_fd(ssh, c, &c->efd);
2142         } else if (c->extended_usage == CHAN_EXTENDED_IGNORE)
2143                 debug3("channel %d: discard efd", c->self);
2144         else if ((r = sshbuf_put(c->extended, buf, len)) != 0)
2145                 fatal_fr(r, "channel %i: append", c->self);
2146         return 1;
2147 }
2148
2149 static int
2150 channel_handle_efd(struct ssh *ssh, Channel *c)
2151 {
2152         if (c->efd == -1)
2153                 return 1;
2154
2155         /** XXX handle drain efd, too */
2156
2157         if (c->extended_usage == CHAN_EXTENDED_WRITE)
2158                 return channel_handle_efd_write(ssh, c);
2159         else if (c->extended_usage == CHAN_EXTENDED_READ ||
2160             c->extended_usage == CHAN_EXTENDED_IGNORE)
2161                 return channel_handle_efd_read(ssh, c);
2162
2163         return 1;
2164 }
2165
2166 static int
2167 channel_check_window(struct ssh *ssh, Channel *c)
2168 {
2169         int r;
2170
2171         if (c->type == SSH_CHANNEL_OPEN &&
2172             !(c->flags & (CHAN_CLOSE_SENT|CHAN_CLOSE_RCVD)) &&
2173             ((c->local_window_max - c->local_window >
2174             c->local_maxpacket*3) ||
2175             c->local_window < c->local_window_max/2) &&
2176             c->local_consumed > 0) {
2177                 if (!c->have_remote_id)
2178                         fatal_f("channel %d: no remote id", c->self);
2179                 if ((r = sshpkt_start(ssh,
2180                     SSH2_MSG_CHANNEL_WINDOW_ADJUST)) != 0 ||
2181                     (r = sshpkt_put_u32(ssh, c->remote_id)) != 0 ||
2182                     (r = sshpkt_put_u32(ssh, c->local_consumed)) != 0 ||
2183                     (r = sshpkt_send(ssh)) != 0) {
2184                         fatal_fr(r, "channel %i", c->self);
2185                 }
2186                 debug2("channel %d: window %d sent adjust %d", c->self,
2187                     c->local_window, c->local_consumed);
2188                 c->local_window += c->local_consumed;
2189                 c->local_consumed = 0;
2190         }
2191         return 1;
2192 }
2193
2194 static void
2195 channel_post_open(struct ssh *ssh, Channel *c)
2196 {
2197         channel_handle_rfd(ssh, c);
2198         channel_handle_wfd(ssh, c);
2199         channel_handle_efd(ssh, c);
2200         channel_check_window(ssh, c);
2201 }
2202
2203 static u_int
2204 read_mux(struct ssh *ssh, Channel *c, u_int need)
2205 {
2206         char buf[CHAN_RBUF];
2207         ssize_t len;
2208         u_int rlen;
2209         int r;
2210
2211         if (sshbuf_len(c->input) < need) {
2212                 rlen = need - sshbuf_len(c->input);
2213                 len = read(c->rfd, buf, MINIMUM(rlen, CHAN_RBUF));
2214                 if (len == -1 && (errno == EINTR || errno == EAGAIN))
2215                         return sshbuf_len(c->input);
2216                 if (len <= 0) {
2217                         debug2("channel %d: ctl read<=0 rfd %d len %zd",
2218                             c->self, c->rfd, len);
2219                         chan_read_failed(ssh, c);
2220                         return 0;
2221                 } else if ((r = sshbuf_put(c->input, buf, len)) != 0)
2222                         fatal_fr(r, "channel %i: append", c->self);
2223         }
2224         return sshbuf_len(c->input);
2225 }
2226
2227 static void
2228 channel_post_mux_client_read(struct ssh *ssh, Channel *c)
2229 {
2230         u_int need;
2231
2232         if ((c->io_ready & SSH_CHAN_IO_RFD) == 0)
2233                 return;
2234         if (c->istate != CHAN_INPUT_OPEN && c->istate != CHAN_INPUT_WAIT_DRAIN)
2235                 return;
2236         if (c->mux_pause)
2237                 return;
2238
2239         /*
2240          * Don't not read past the precise end of packets to
2241          * avoid disrupting fd passing.
2242          */
2243         if (read_mux(ssh, c, 4) < 4) /* read header */
2244                 return;
2245         /* XXX sshbuf_peek_u32 */
2246         need = PEEK_U32(sshbuf_ptr(c->input));
2247 #define CHANNEL_MUX_MAX_PACKET  (256 * 1024)
2248         if (need > CHANNEL_MUX_MAX_PACKET) {
2249                 debug2("channel %d: packet too big %u > %u",
2250                     c->self, CHANNEL_MUX_MAX_PACKET, need);
2251                 chan_rcvd_oclose(ssh, c);
2252                 return;
2253         }
2254         if (read_mux(ssh, c, need + 4) < need + 4) /* read body */
2255                 return;
2256         if (c->mux_rcb(ssh, c) != 0) {
2257                 debug("channel %d: mux_rcb failed", c->self);
2258                 chan_mark_dead(ssh, c);
2259                 return;
2260         }
2261 }
2262
2263 static void
2264 channel_post_mux_client_write(struct ssh *ssh, Channel *c)
2265 {
2266         ssize_t len;
2267         int r;
2268
2269         if ((c->io_ready & SSH_CHAN_IO_WFD) == 0)
2270                 return;
2271         if (sshbuf_len(c->output) == 0)
2272                 return;
2273
2274         len = write(c->wfd, sshbuf_ptr(c->output), sshbuf_len(c->output));
2275         if (len == -1 && (errno == EINTR || errno == EAGAIN))
2276                 return;
2277         if (len <= 0) {
2278                 chan_mark_dead(ssh, c);
2279                 return;
2280         }
2281         if ((r = sshbuf_consume(c->output, len)) != 0)
2282                 fatal_fr(r, "channel %i: consume", c->self);
2283 }
2284
2285 static void
2286 channel_post_mux_client(struct ssh *ssh, Channel *c)
2287 {
2288         channel_post_mux_client_read(ssh, c);
2289         channel_post_mux_client_write(ssh, c);
2290 }
2291
2292 static void
2293 channel_post_mux_listener(struct ssh *ssh, Channel *c)
2294 {
2295         Channel *nc;
2296         struct sockaddr_storage addr;
2297         socklen_t addrlen;
2298         int newsock;
2299         uid_t euid;
2300         gid_t egid;
2301
2302         if ((c->io_ready & SSH_CHAN_IO_SOCK_R) == 0)
2303                 return;
2304
2305         debug("multiplexing control connection");
2306
2307         /*
2308          * Accept connection on control socket
2309          */
2310         memset(&addr, 0, sizeof(addr));
2311         addrlen = sizeof(addr);
2312         if ((newsock = accept(c->sock, (struct sockaddr*)&addr,
2313             &addrlen)) == -1) {
2314                 error_f("accept: %s", strerror(errno));
2315                 if (errno == EMFILE || errno == ENFILE)
2316                         c->notbefore = monotime() + 1;
2317                 return;
2318         }
2319
2320         if (getpeereid(newsock, &euid, &egid) == -1) {
2321                 error_f("getpeereid failed: %s", strerror(errno));
2322                 close(newsock);
2323                 return;
2324         }
2325         if ((euid != 0) && (getuid() != euid)) {
2326                 error("multiplex uid mismatch: peer euid %u != uid %u",
2327                     (u_int)euid, (u_int)getuid());
2328                 close(newsock);
2329                 return;
2330         }
2331         nc = channel_new(ssh, "multiplex client", SSH_CHANNEL_MUX_CLIENT,
2332             newsock, newsock, -1, c->local_window_max,
2333             c->local_maxpacket, 0, "mux-control", 1);
2334         nc->mux_rcb = c->mux_rcb;
2335         debug3_f("new mux channel %d fd %d", nc->self, nc->sock);
2336         /* establish state */
2337         nc->mux_rcb(ssh, nc);
2338         /* mux state transitions must not elicit protocol messages */
2339         nc->flags |= CHAN_LOCAL;
2340 }
2341
2342 static void
2343 channel_handler_init(struct ssh_channels *sc)
2344 {
2345         chan_fn **pre, **post;
2346
2347         if ((pre = calloc(SSH_CHANNEL_MAX_TYPE, sizeof(*pre))) == NULL ||
2348             (post = calloc(SSH_CHANNEL_MAX_TYPE, sizeof(*post))) == NULL)
2349                 fatal_f("allocation failed");
2350
2351         pre[SSH_CHANNEL_OPEN] =                 &channel_pre_open;
2352         pre[SSH_CHANNEL_X11_OPEN] =             &channel_pre_x11_open;
2353         pre[SSH_CHANNEL_PORT_LISTENER] =        &channel_pre_listener;
2354         pre[SSH_CHANNEL_RPORT_LISTENER] =       &channel_pre_listener;
2355         pre[SSH_CHANNEL_UNIX_LISTENER] =        &channel_pre_listener;
2356         pre[SSH_CHANNEL_RUNIX_LISTENER] =       &channel_pre_listener;
2357         pre[SSH_CHANNEL_X11_LISTENER] =         &channel_pre_listener;
2358         pre[SSH_CHANNEL_AUTH_SOCKET] =          &channel_pre_listener;
2359         pre[SSH_CHANNEL_CONNECTING] =           &channel_pre_connecting;
2360         pre[SSH_CHANNEL_DYNAMIC] =              &channel_pre_dynamic;
2361         pre[SSH_CHANNEL_RDYNAMIC_FINISH] =      &channel_pre_connecting;
2362         pre[SSH_CHANNEL_MUX_LISTENER] =         &channel_pre_listener;
2363         pre[SSH_CHANNEL_MUX_CLIENT] =           &channel_pre_mux_client;
2364
2365         post[SSH_CHANNEL_OPEN] =                &channel_post_open;
2366         post[SSH_CHANNEL_PORT_LISTENER] =       &channel_post_port_listener;
2367         post[SSH_CHANNEL_RPORT_LISTENER] =      &channel_post_port_listener;
2368         post[SSH_CHANNEL_UNIX_LISTENER] =       &channel_post_port_listener;
2369         post[SSH_CHANNEL_RUNIX_LISTENER] =      &channel_post_port_listener;
2370         post[SSH_CHANNEL_X11_LISTENER] =        &channel_post_x11_listener;
2371         post[SSH_CHANNEL_AUTH_SOCKET] =         &channel_post_auth_listener;
2372         post[SSH_CHANNEL_CONNECTING] =          &channel_post_connecting;
2373         post[SSH_CHANNEL_DYNAMIC] =             &channel_post_open;
2374         post[SSH_CHANNEL_RDYNAMIC_FINISH] =     &channel_post_connecting;
2375         post[SSH_CHANNEL_MUX_LISTENER] =        &channel_post_mux_listener;
2376         post[SSH_CHANNEL_MUX_CLIENT] =          &channel_post_mux_client;
2377
2378         sc->channel_pre = pre;
2379         sc->channel_post = post;
2380 }
2381
2382 /* gc dead channels */
2383 static void
2384 channel_garbage_collect(struct ssh *ssh, Channel *c)
2385 {
2386         if (c == NULL)
2387                 return;
2388         if (c->detach_user != NULL) {
2389                 if (!chan_is_dead(ssh, c, c->detach_close))
2390                         return;
2391
2392                 debug2("channel %d: gc: notify user", c->self);
2393                 c->detach_user(ssh, c->self, NULL);
2394                 /* if we still have a callback */
2395                 if (c->detach_user != NULL)
2396                         return;
2397                 debug2("channel %d: gc: user detached", c->self);
2398         }
2399         if (!chan_is_dead(ssh, c, 1))
2400                 return;
2401         debug2("channel %d: garbage collecting", c->self);
2402         channel_free(ssh, c);
2403 }
2404
2405 enum channel_table { CHAN_PRE, CHAN_POST };
2406
2407 static void
2408 channel_handler(struct ssh *ssh, int table, time_t *unpause_secs)
2409 {
2410         struct ssh_channels *sc = ssh->chanctxt;
2411         chan_fn **ftab = table == CHAN_PRE ? sc->channel_pre : sc->channel_post;
2412         u_int i, oalloc;
2413         Channel *c;
2414         time_t now;
2415
2416         now = monotime();
2417         if (unpause_secs != NULL)
2418                 *unpause_secs = 0;
2419         for (i = 0, oalloc = sc->channels_alloc; i < oalloc; i++) {
2420                 c = sc->channels[i];
2421                 if (c == NULL)
2422                         continue;
2423                 if (c->delayed) {
2424                         if (table == CHAN_PRE)
2425                                 c->delayed = 0;
2426                         else
2427                                 continue;
2428                 }
2429                 if (ftab[c->type] != NULL) {
2430                         /*
2431                          * Run handlers that are not paused.
2432                          */
2433                         if (c->notbefore <= now)
2434                                 (*ftab[c->type])(ssh, c);
2435                         else if (unpause_secs != NULL) {
2436                                 /*
2437                                  * Collect the time that the earliest
2438                                  * channel comes off pause.
2439                                  */
2440                                 debug3_f("chan %d: skip for %d more "
2441                                     "seconds", c->self,
2442                                     (int)(c->notbefore - now));
2443                                 if (*unpause_secs == 0 ||
2444                                     (c->notbefore - now) < *unpause_secs)
2445                                         *unpause_secs = c->notbefore - now;
2446                         }
2447                 }
2448                 channel_garbage_collect(ssh, c);
2449         }
2450         if (unpause_secs != NULL && *unpause_secs != 0)
2451                 debug3_f("first channel unpauses in %d seconds",
2452                     (int)*unpause_secs);
2453 }
2454
2455 /*
2456  * Create sockets before preparing IO.
2457  * This is necessary for things that need to happen after reading
2458  * the network-input but need to be completed before IO event setup, e.g.
2459  * because they may create new channels.
2460  */
2461 static void
2462 channel_before_prepare_io(struct ssh *ssh)
2463 {
2464         struct ssh_channels *sc = ssh->chanctxt;
2465         Channel *c;
2466         u_int i, oalloc;
2467
2468         for (i = 0, oalloc = sc->channels_alloc; i < oalloc; i++) {
2469                 c = sc->channels[i];
2470                 if (c == NULL)
2471                         continue;
2472                 if (c->type == SSH_CHANNEL_RDYNAMIC_OPEN)
2473                         channel_before_prepare_io_rdynamic(ssh, c);
2474         }
2475 }
2476
2477 static void
2478 dump_channel_poll(const char *func, const char *what, Channel *c,
2479     u_int pollfd_offset, struct pollfd *pfd)
2480 {
2481 #ifdef DEBUG_CHANNEL_POLL
2482         debug3("%s: channel %d: %s r%d w%d e%d s%d c->pfds [ %d %d %d %d ] "
2483             "io_want 0x%02x io_ready 0x%02x pfd[%u].fd=%d "
2484             "pfd.ev 0x%02x pfd.rev 0x%02x", func, c->self, what,
2485             c->rfd, c->wfd, c->efd, c->sock,
2486             c->pfds[0], c->pfds[1], c->pfds[2], c->pfds[3],
2487             c->io_want, c->io_ready,
2488             pollfd_offset, pfd->fd, pfd->events, pfd->revents);
2489 #endif
2490 }
2491
2492 /* Prepare pollfd entries for a single channel */
2493 static void
2494 channel_prepare_pollfd(Channel *c, u_int *next_pollfd,
2495     struct pollfd *pfd, u_int npfd)
2496 {
2497         u_int ev, p = *next_pollfd;
2498
2499         if (c == NULL)
2500                 return;
2501         if (p + 4 > npfd) {
2502                 /* Shouldn't happen */
2503                 fatal_f("channel %d: bad pfd offset %u (max %u)",
2504                     c->self, p, npfd);
2505         }
2506         c->pfds[0] = c->pfds[1] = c->pfds[2] = c->pfds[3] = -1;
2507         /*
2508          * prepare c->rfd
2509          *
2510          * This is a special case, since c->rfd might be the same as
2511          * c->wfd, c->efd and/or c->sock. Handle those here if they want
2512          * IO too.
2513          */
2514         if (c->rfd != -1) {
2515                 ev = 0;
2516                 if ((c->io_want & SSH_CHAN_IO_RFD) != 0)
2517                         ev |= POLLIN;
2518                 /* rfd == wfd */
2519                 if (c->wfd == c->rfd) {
2520                         if ((c->io_want & SSH_CHAN_IO_WFD) != 0)
2521                                 ev |= POLLOUT;
2522                 }
2523                 /* rfd == efd */
2524                 if (c->efd == c->rfd) {
2525                         if ((c->io_want & SSH_CHAN_IO_EFD_R) != 0)
2526                                 ev |= POLLIN;
2527                         if ((c->io_want & SSH_CHAN_IO_EFD_W) != 0)
2528                                 ev |= POLLOUT;
2529                 }
2530                 /* rfd == sock */
2531                 if (c->sock == c->rfd) {
2532                         if ((c->io_want & SSH_CHAN_IO_SOCK_R) != 0)
2533                                 ev |= POLLIN;
2534                         if ((c->io_want & SSH_CHAN_IO_SOCK_W) != 0)
2535                                 ev |= POLLOUT;
2536                 }
2537                 /* Pack a pfd entry if any event armed for this fd */
2538                 if (ev != 0) {
2539                         c->pfds[0] = p;
2540                         pfd[p].fd = c->rfd;
2541                         pfd[p].events = ev;
2542                         dump_channel_poll(__func__, "rfd", c, p, &pfd[p]);
2543                         p++;
2544                 }
2545         }
2546         /* prepare c->wfd if wanting IO and not already handled above */
2547         if (c->wfd != -1 && c->rfd != c->wfd) {
2548                 ev = 0;
2549                 if ((c->io_want & SSH_CHAN_IO_WFD))
2550                         ev |= POLLOUT;
2551                 /* Pack a pfd entry if any event armed for this fd */
2552                 if (ev != 0) {
2553                         c->pfds[1] = p;
2554                         pfd[p].fd = c->wfd;
2555                         pfd[p].events = ev;
2556                         dump_channel_poll(__func__, "wfd", c, p, &pfd[p]);
2557                         p++;
2558                 }
2559         }
2560         /* prepare c->efd if wanting IO and not already handled above */
2561         if (c->efd != -1 && c->rfd != c->efd) {
2562                 ev = 0;
2563                 if ((c->io_want & SSH_CHAN_IO_EFD_R) != 0)
2564                         ev |= POLLIN;
2565                 if ((c->io_want & SSH_CHAN_IO_EFD_W) != 0)
2566                         ev |= POLLOUT;
2567                 /* Pack a pfd entry if any event armed for this fd */
2568                 if (ev != 0) {
2569                         c->pfds[2] = p;
2570                         pfd[p].fd = c->efd;
2571                         pfd[p].events = ev;
2572                         dump_channel_poll(__func__, "efd", c, p, &pfd[p]);
2573                         p++;
2574                 }
2575         }
2576         /* prepare c->sock if wanting IO and not already handled above */
2577         if (c->sock != -1 && c->rfd != c->sock) {
2578                 ev = 0;
2579                 if ((c->io_want & SSH_CHAN_IO_SOCK_R) != 0)
2580                         ev |= POLLIN;
2581                 if ((c->io_want & SSH_CHAN_IO_SOCK_W) != 0)
2582                         ev |= POLLOUT;
2583                 /* Pack a pfd entry if any event armed for this fd */
2584                 if (ev != 0) {
2585                         c->pfds[3] = p;
2586                         pfd[p].fd = c->sock;
2587                         pfd[p].events = 0;
2588                         dump_channel_poll(__func__, "sock", c, p, &pfd[p]);
2589                         p++;
2590                 }
2591         }
2592         *next_pollfd = p;
2593 }
2594
2595 /* * Allocate/prepare poll structure */
2596 void
2597 channel_prepare_poll(struct ssh *ssh, struct pollfd **pfdp, u_int *npfd_allocp,
2598     u_int *npfd_activep, u_int npfd_reserved, time_t *minwait_secs)
2599 {
2600         struct ssh_channels *sc = ssh->chanctxt;
2601         u_int i, oalloc, p, npfd = npfd_reserved;
2602
2603         channel_before_prepare_io(ssh); /* might create a new channel */
2604         /* clear out I/O flags from last poll */
2605         for (i = 0; i < sc->channels_alloc; i++) {
2606                 if (sc->channels[i] == NULL)
2607                         continue;
2608                 sc->channels[i]->io_want = sc->channels[i]->io_ready = 0;
2609         }
2610         /* Allocate 4x pollfd for each channel (rfd, wfd, efd, sock) */
2611         if (sc->channels_alloc >= (INT_MAX / 4) - npfd_reserved)
2612                 fatal_f("too many channels"); /* shouldn't happen */
2613         if (!ssh_packet_is_rekeying(ssh))
2614                 npfd += sc->channels_alloc * 4;
2615         if (npfd > *npfd_allocp) {
2616                 *pfdp = xrecallocarray(*pfdp, *npfd_allocp,
2617                     npfd, sizeof(**pfdp));
2618                 *npfd_allocp = npfd;
2619         }
2620         *npfd_activep = npfd_reserved;
2621         if (ssh_packet_is_rekeying(ssh))
2622                 return;
2623
2624         oalloc = sc->channels_alloc;
2625
2626         channel_handler(ssh, CHAN_PRE, minwait_secs);
2627
2628         if (oalloc != sc->channels_alloc) {
2629                 /* shouldn't happen */
2630                 fatal_f("channels_alloc changed during CHAN_PRE "
2631                     "(was %u, now %u)", oalloc, sc->channels_alloc);
2632         }
2633
2634         /* Prepare pollfd */
2635         p = npfd_reserved;
2636         for (i = 0; i < sc->channels_alloc; i++)
2637                 channel_prepare_pollfd(sc->channels[i], &p, *pfdp, npfd);
2638         *npfd_activep = p;
2639 }
2640
2641 static void
2642 fd_ready(Channel *c, int p, struct pollfd *pfds, u_int npfd, int fd,
2643     const char *what, u_int revents_mask, u_int ready)
2644 {
2645         struct pollfd *pfd = &pfds[p];
2646
2647         if (fd == -1)
2648                 return;
2649         if (p == -1 || (u_int)p >= npfd)
2650                 fatal_f("channel %d: bad pfd %d (max %u)", c->self, p, npfd);
2651         dump_channel_poll(__func__, what, c, p, pfd);
2652         if (pfd->fd != fd) {
2653                 fatal("channel %d: inconsistent %s fd=%d pollfd[%u].fd %d "
2654                     "r%d w%d e%d s%d", c->self, what, fd, p, pfd->fd,
2655                     c->rfd, c->wfd, c->efd, c->sock);
2656         }
2657         if ((pfd->revents & POLLNVAL) != 0) {
2658                 fatal("channel %d: invalid %s pollfd[%u].fd %d r%d w%d e%d s%d",
2659                     c->self, what, p, pfd->fd, c->rfd, c->wfd, c->efd, c->sock);
2660         }
2661         if ((pfd->revents & (revents_mask|POLLHUP|POLLERR)) != 0)
2662                 c->io_ready |= ready & c->io_want;
2663 }
2664
2665 /*
2666  * After poll, perform any appropriate operations for channels which have
2667  * events pending.
2668  */
2669 void
2670 channel_after_poll(struct ssh *ssh, struct pollfd *pfd, u_int npfd)
2671 {
2672         struct ssh_channels *sc = ssh->chanctxt;
2673         u_int i;
2674         int p;
2675         Channel *c;
2676
2677 #ifdef DEBUG_CHANNEL_POLL
2678         for (p = 0; p < (int)npfd; p++) {
2679                 if (pfd[p].revents == 0)
2680                         continue;
2681                 debug_f("pfd[%u].fd %d rev 0x%04x",
2682                     p, pfd[p].fd, pfd[p].revents);
2683         }
2684 #endif
2685
2686         /* Convert pollfd into c->io_ready */
2687         for (i = 0; i < sc->channels_alloc; i++) {
2688                 c = sc->channels[i];
2689                 if (c == NULL)
2690                         continue;
2691                 /* if rfd is shared with efd/sock then wfd should be too */
2692                 if (c->rfd != -1 && c->wfd != -1 && c->rfd != c->wfd &&
2693                     (c->rfd == c->efd || c->rfd == c->sock)) {
2694                         /* Shouldn't happen */
2695                         fatal_f("channel %d: unexpected fds r%d w%d e%d s%d",
2696                             c->self, c->rfd, c->wfd, c->efd, c->sock);
2697                 }
2698                 c->io_ready = 0;
2699                 /* rfd, potentially shared with wfd, efd and sock */
2700                 if (c->rfd != -1 && (p = c->pfds[0]) != -1) {
2701                         fd_ready(c, p, pfd, npfd, c->rfd,
2702                             "rfd", POLLIN, SSH_CHAN_IO_RFD);
2703                         if (c->rfd == c->wfd) {
2704                                 fd_ready(c, p, pfd, npfd, c->wfd,
2705                                     "wfd/r", POLLOUT, SSH_CHAN_IO_WFD);
2706                         }
2707                         if (c->rfd == c->efd) {
2708                                 fd_ready(c, p, pfd, npfd, c->efd,
2709                                     "efdr/r", POLLIN, SSH_CHAN_IO_EFD_R);
2710                                 fd_ready(c, p, pfd, npfd, c->efd,
2711                                     "efdw/r", POLLOUT, SSH_CHAN_IO_EFD_W);
2712                         }
2713                         if (c->rfd == c->sock) {
2714                                 fd_ready(c, p, pfd, npfd, c->sock,
2715                                     "sockr/r", POLLIN, SSH_CHAN_IO_SOCK_R);
2716                                 fd_ready(c, p, pfd, npfd, c->sock,
2717                                     "sockw/r", POLLOUT, SSH_CHAN_IO_SOCK_W);
2718                         }
2719                         dump_channel_poll(__func__, "rfd", c, p, pfd);
2720                 }
2721                 /* wfd */
2722                 if (c->wfd != -1 && c->wfd != c->rfd &&
2723                     (p = c->pfds[1]) != -1) {
2724                         fd_ready(c, p, pfd, npfd, c->wfd,
2725                             "wfd", POLLOUT, SSH_CHAN_IO_WFD);
2726                         dump_channel_poll(__func__, "wfd", c, p, pfd);
2727                 }
2728                 /* efd */
2729                 if (c->efd != -1 && c->efd != c->rfd &&
2730                     (p = c->pfds[2]) != -1) {
2731                         fd_ready(c, p, pfd, npfd, c->efd,
2732                             "efdr", POLLIN, SSH_CHAN_IO_EFD_R);
2733                         fd_ready(c, p, pfd, npfd, c->efd,
2734                             "efdw", POLLOUT, SSH_CHAN_IO_EFD_W);
2735                         dump_channel_poll(__func__, "efd", c, p, pfd);
2736                 }
2737                 /* sock */
2738                 if (c->sock != -1 && c->sock != c->rfd &&
2739                     (p = c->pfds[3]) != -1) {
2740                         fd_ready(c, p, pfd, npfd, c->sock,
2741                             "sockr", POLLIN, SSH_CHAN_IO_SOCK_R);
2742                         fd_ready(c, p, pfd, npfd, c->sock,
2743                             "sockw", POLLOUT, SSH_CHAN_IO_SOCK_W);
2744                         dump_channel_poll(__func__, "sock", c, p, pfd);
2745                 }
2746         }
2747         channel_handler(ssh, CHAN_POST, NULL);
2748 }
2749
2750 /*
2751  * Enqueue data for channels with open or draining c->input.
2752  */
2753 static void
2754 channel_output_poll_input_open(struct ssh *ssh, Channel *c)
2755 {
2756         size_t len, plen;
2757         const u_char *pkt;
2758         int r;
2759
2760         if ((len = sshbuf_len(c->input)) == 0) {
2761                 if (c->istate == CHAN_INPUT_WAIT_DRAIN) {
2762                         /*
2763                          * input-buffer is empty and read-socket shutdown:
2764                          * tell peer, that we will not send more data:
2765                          * send IEOF.
2766                          * hack for extended data: delay EOF if EFD still
2767                          * in use.
2768                          */
2769                         if (CHANNEL_EFD_INPUT_ACTIVE(c))
2770                                 debug2("channel %d: "
2771                                     "ibuf_empty delayed efd %d/(%zu)",
2772                                     c->self, c->efd, sshbuf_len(c->extended));
2773                         else
2774                                 chan_ibuf_empty(ssh, c);
2775                 }
2776                 return;
2777         }
2778
2779         if (!c->have_remote_id)
2780                 fatal_f("channel %d: no remote id", c->self);
2781
2782         if (c->datagram) {
2783                 /* Check datagram will fit; drop if not */
2784                 if ((r = sshbuf_get_string_direct(c->input, &pkt, &plen)) != 0)
2785                         fatal_fr(r, "channel %i: get datagram", c->self);
2786                 /*
2787                  * XXX this does tail-drop on the datagram queue which is
2788                  * usually suboptimal compared to head-drop. Better to have
2789                  * backpressure at read time? (i.e. read + discard)
2790                  */
2791                 if (plen > c->remote_window || plen > c->remote_maxpacket) {
2792                         debug("channel %d: datagram too big", c->self);
2793                         return;
2794                 }
2795                 /* Enqueue it */
2796                 if ((r = sshpkt_start(ssh, SSH2_MSG_CHANNEL_DATA)) != 0 ||
2797                     (r = sshpkt_put_u32(ssh, c->remote_id)) != 0 ||
2798                     (r = sshpkt_put_string(ssh, pkt, plen)) != 0 ||
2799                     (r = sshpkt_send(ssh)) != 0)
2800                         fatal_fr(r, "channel %i: send datagram", c->self);
2801                 c->remote_window -= plen;
2802                 return;
2803         }
2804
2805         /* Enqueue packet for buffered data. */
2806         if (len > c->remote_window)
2807                 len = c->remote_window;
2808         if (len > c->remote_maxpacket)
2809                 len = c->remote_maxpacket;
2810         if (len == 0)
2811                 return;
2812         if ((r = sshpkt_start(ssh, SSH2_MSG_CHANNEL_DATA)) != 0 ||
2813             (r = sshpkt_put_u32(ssh, c->remote_id)) != 0 ||
2814             (r = sshpkt_put_string(ssh, sshbuf_ptr(c->input), len)) != 0 ||
2815             (r = sshpkt_send(ssh)) != 0)
2816                 fatal_fr(r, "channel %i: send data", c->self);
2817         if ((r = sshbuf_consume(c->input, len)) != 0)
2818                 fatal_fr(r, "channel %i: consume", c->self);
2819         c->remote_window -= len;
2820 }
2821
2822 /*
2823  * Enqueue data for channels with open c->extended in read mode.
2824  */
2825 static void
2826 channel_output_poll_extended_read(struct ssh *ssh, Channel *c)
2827 {
2828         size_t len;
2829         int r;
2830
2831         if ((len = sshbuf_len(c->extended)) == 0)
2832                 return;
2833
2834         debug2("channel %d: rwin %u elen %zu euse %d", c->self,
2835             c->remote_window, sshbuf_len(c->extended), c->extended_usage);
2836         if (len > c->remote_window)
2837                 len = c->remote_window;
2838         if (len > c->remote_maxpacket)
2839                 len = c->remote_maxpacket;
2840         if (len == 0)
2841                 return;
2842         if (!c->have_remote_id)
2843                 fatal_f("channel %d: no remote id", c->self);
2844         if ((r = sshpkt_start(ssh, SSH2_MSG_CHANNEL_EXTENDED_DATA)) != 0 ||
2845             (r = sshpkt_put_u32(ssh, c->remote_id)) != 0 ||
2846             (r = sshpkt_put_u32(ssh, SSH2_EXTENDED_DATA_STDERR)) != 0 ||
2847             (r = sshpkt_put_string(ssh, sshbuf_ptr(c->extended), len)) != 0 ||
2848             (r = sshpkt_send(ssh)) != 0)
2849                 fatal_fr(r, "channel %i: data", c->self);
2850         if ((r = sshbuf_consume(c->extended, len)) != 0)
2851                 fatal_fr(r, "channel %i: consume", c->self);
2852         c->remote_window -= len;
2853         debug2("channel %d: sent ext data %zu", c->self, len);
2854 }
2855
2856 /* If there is data to send to the connection, enqueue some of it now. */
2857 void
2858 channel_output_poll(struct ssh *ssh)
2859 {
2860         struct ssh_channels *sc = ssh->chanctxt;
2861         Channel *c;
2862         u_int i;
2863
2864         for (i = 0; i < sc->channels_alloc; i++) {
2865                 c = sc->channels[i];
2866                 if (c == NULL)
2867                         continue;
2868
2869                 /*
2870                  * We are only interested in channels that can have buffered
2871                  * incoming data.
2872                  */
2873                 if (c->type != SSH_CHANNEL_OPEN)
2874                         continue;
2875                 if ((c->flags & (CHAN_CLOSE_SENT|CHAN_CLOSE_RCVD))) {
2876                         /* XXX is this true? */
2877                         debug3("channel %d: will not send data after close",
2878                             c->self);
2879                         continue;
2880                 }
2881
2882                 /* Get the amount of buffered data for this channel. */
2883                 if (c->istate == CHAN_INPUT_OPEN ||
2884                     c->istate == CHAN_INPUT_WAIT_DRAIN)
2885                         channel_output_poll_input_open(ssh, c);
2886                 /* Send extended data, i.e. stderr */
2887                 if (!(c->flags & CHAN_EOF_SENT) &&
2888                     c->extended_usage == CHAN_EXTENDED_READ)
2889                         channel_output_poll_extended_read(ssh, c);
2890         }
2891 }
2892
2893 /* -- mux proxy support  */
2894
2895 /*
2896  * When multiplexing channel messages for mux clients we have to deal
2897  * with downstream messages from the mux client and upstream messages
2898  * from the ssh server:
2899  * 1) Handling downstream messages is straightforward and happens
2900  *    in channel_proxy_downstream():
2901  *    - We forward all messages (mostly) unmodified to the server.
2902  *    - However, in order to route messages from upstream to the correct
2903  *      downstream client, we have to replace the channel IDs used by the
2904  *      mux clients with a unique channel ID because the mux clients might
2905  *      use conflicting channel IDs.
2906  *    - so we inspect and change both SSH2_MSG_CHANNEL_OPEN and
2907  *      SSH2_MSG_CHANNEL_OPEN_CONFIRMATION messages, create a local
2908  *      SSH_CHANNEL_MUX_PROXY channel and replace the mux clients ID
2909  *      with the newly allocated channel ID.
2910  * 2) Upstream messages are received by matching SSH_CHANNEL_MUX_PROXY
2911  *    channels and processed by channel_proxy_upstream(). The local channel ID
2912  *    is then translated back to the original mux client ID.
2913  * 3) In both cases we need to keep track of matching SSH2_MSG_CHANNEL_CLOSE
2914  *    messages so we can clean up SSH_CHANNEL_MUX_PROXY channels.
2915  * 4) The SSH_CHANNEL_MUX_PROXY channels also need to closed when the
2916  *    downstream mux client are removed.
2917  * 5) Handling SSH2_MSG_CHANNEL_OPEN messages from the upstream server
2918  *    requires more work, because they are not addressed to a specific
2919  *    channel. E.g. client_request_forwarded_tcpip() needs to figure
2920  *    out whether the request is addressed to the local client or a
2921  *    specific downstream client based on the listen-address/port.
2922  * 6) Agent and X11-Forwarding have a similar problem and are currently
2923  *    not supported as the matching session/channel cannot be identified
2924  *    easily.
2925  */
2926
2927 /*
2928  * receive packets from downstream mux clients:
2929  * channel callback fired on read from mux client, creates
2930  * SSH_CHANNEL_MUX_PROXY channels and translates channel IDs
2931  * on channel creation.
2932  */
2933 int
2934 channel_proxy_downstream(struct ssh *ssh, Channel *downstream)
2935 {
2936         Channel *c = NULL;
2937         struct sshbuf *original = NULL, *modified = NULL;
2938         const u_char *cp;
2939         char *ctype = NULL, *listen_host = NULL;
2940         u_char type;
2941         size_t have;
2942         int ret = -1, r;
2943         u_int id, remote_id, listen_port;
2944
2945         /* sshbuf_dump(downstream->input, stderr); */
2946         if ((r = sshbuf_get_string_direct(downstream->input, &cp, &have))
2947             != 0) {
2948                 error_fr(r, "parse");
2949                 return -1;
2950         }
2951         if (have < 2) {
2952                 error_f("short message");
2953                 return -1;
2954         }
2955         type = cp[1];
2956         /* skip padlen + type */
2957         cp += 2;
2958         have -= 2;
2959         if (ssh_packet_log_type(type))
2960                 debug3_f("channel %u: down->up: type %u",
2961                     downstream->self, type);
2962
2963         switch (type) {
2964         case SSH2_MSG_CHANNEL_OPEN:
2965                 if ((original = sshbuf_from(cp, have)) == NULL ||
2966                     (modified = sshbuf_new()) == NULL) {
2967                         error_f("alloc");
2968                         goto out;
2969                 }
2970                 if ((r = sshbuf_get_cstring(original, &ctype, NULL)) != 0 ||
2971                     (r = sshbuf_get_u32(original, &id)) != 0) {
2972                         error_fr(r, "parse");
2973                         goto out;
2974                 }
2975                 c = channel_new(ssh, "mux proxy", SSH_CHANNEL_MUX_PROXY,
2976                     -1, -1, -1, 0, 0, 0, ctype, 1);
2977                 c->mux_ctx = downstream;        /* point to mux client */
2978                 c->mux_downstream_id = id;      /* original downstream id */
2979                 if ((r = sshbuf_put_cstring(modified, ctype)) != 0 ||
2980                     (r = sshbuf_put_u32(modified, c->self)) != 0 ||
2981                     (r = sshbuf_putb(modified, original)) != 0) {
2982                         error_fr(r, "compose");
2983                         channel_free(ssh, c);
2984                         goto out;
2985                 }
2986                 break;
2987         case SSH2_MSG_CHANNEL_OPEN_CONFIRMATION:
2988                 /*
2989                  * Almost the same as SSH2_MSG_CHANNEL_OPEN, except then we
2990                  * need to parse 'remote_id' instead of 'ctype'.
2991                  */
2992                 if ((original = sshbuf_from(cp, have)) == NULL ||
2993                     (modified = sshbuf_new()) == NULL) {
2994                         error_f("alloc");
2995                         goto out;
2996                 }
2997                 if ((r = sshbuf_get_u32(original, &remote_id)) != 0 ||
2998                     (r = sshbuf_get_u32(original, &id)) != 0) {
2999                         error_fr(r, "parse");
3000                         goto out;
3001                 }
3002                 c = channel_new(ssh, "mux proxy", SSH_CHANNEL_MUX_PROXY,
3003                     -1, -1, -1, 0, 0, 0, "mux-down-connect", 1);
3004                 c->mux_ctx = downstream;        /* point to mux client */
3005                 c->mux_downstream_id = id;
3006                 c->remote_id = remote_id;
3007                 c->have_remote_id = 1;
3008                 if ((r = sshbuf_put_u32(modified, remote_id)) != 0 ||
3009                     (r = sshbuf_put_u32(modified, c->self)) != 0 ||
3010                     (r = sshbuf_putb(modified, original)) != 0) {
3011                         error_fr(r, "compose");
3012                         channel_free(ssh, c);
3013                         goto out;
3014                 }
3015                 break;
3016         case SSH2_MSG_GLOBAL_REQUEST:
3017                 if ((original = sshbuf_from(cp, have)) == NULL) {
3018                         error_f("alloc");
3019                         goto out;
3020                 }
3021                 if ((r = sshbuf_get_cstring(original, &ctype, NULL)) != 0) {
3022                         error_fr(r, "parse");
3023                         goto out;
3024                 }
3025                 if (strcmp(ctype, "tcpip-forward") != 0) {
3026                         error_f("unsupported request %s", ctype);
3027                         goto out;
3028                 }
3029                 if ((r = sshbuf_get_u8(original, NULL)) != 0 ||
3030                     (r = sshbuf_get_cstring(original, &listen_host, NULL)) != 0 ||
3031                     (r = sshbuf_get_u32(original, &listen_port)) != 0) {
3032                         error_fr(r, "parse");
3033                         goto out;
3034                 }
3035                 if (listen_port > 65535) {
3036                         error_f("tcpip-forward for %s: bad port %u",
3037                             listen_host, listen_port);
3038                         goto out;
3039                 }
3040                 /* Record that connection to this host/port is permitted. */
3041                 permission_set_add(ssh, FORWARD_USER, FORWARD_LOCAL, "<mux>", -1,
3042                     listen_host, NULL, (int)listen_port, downstream);
3043                 listen_host = NULL;
3044                 break;
3045         case SSH2_MSG_CHANNEL_CLOSE:
3046                 if (have < 4)
3047                         break;
3048                 remote_id = PEEK_U32(cp);
3049                 if ((c = channel_by_remote_id(ssh, remote_id)) != NULL) {
3050                         if (c->flags & CHAN_CLOSE_RCVD)
3051                                 channel_free(ssh, c);
3052                         else
3053                                 c->flags |= CHAN_CLOSE_SENT;
3054                 }
3055                 break;
3056         }
3057         if (modified) {
3058                 if ((r = sshpkt_start(ssh, type)) != 0 ||
3059                     (r = sshpkt_putb(ssh, modified)) != 0 ||
3060                     (r = sshpkt_send(ssh)) != 0) {
3061                         error_fr(r, "send");
3062                         goto out;
3063                 }
3064         } else {
3065                 if ((r = sshpkt_start(ssh, type)) != 0 ||
3066                     (r = sshpkt_put(ssh, cp, have)) != 0 ||
3067                     (r = sshpkt_send(ssh)) != 0) {
3068                         error_fr(r, "send");
3069                         goto out;
3070                 }
3071         }
3072         ret = 0;
3073  out:
3074         free(ctype);
3075         free(listen_host);
3076         sshbuf_free(original);
3077         sshbuf_free(modified);
3078         return ret;
3079 }
3080
3081 /*
3082  * receive packets from upstream server and de-multiplex packets
3083  * to correct downstream:
3084  * implemented as a helper for channel input handlers,
3085  * replaces local (proxy) channel ID with downstream channel ID.
3086  */
3087 int
3088 channel_proxy_upstream(Channel *c, int type, u_int32_t seq, struct ssh *ssh)
3089 {
3090         struct sshbuf *b = NULL;
3091         Channel *downstream;
3092         const u_char *cp = NULL;
3093         size_t len;
3094         int r;
3095
3096         /*
3097          * When receiving packets from the peer we need to check whether we
3098          * need to forward the packets to the mux client. In this case we
3099          * restore the original channel id and keep track of CLOSE messages,
3100          * so we can cleanup the channel.
3101          */
3102         if (c == NULL || c->type != SSH_CHANNEL_MUX_PROXY)
3103                 return 0;
3104         if ((downstream = c->mux_ctx) == NULL)
3105                 return 0;
3106         switch (type) {
3107         case SSH2_MSG_CHANNEL_CLOSE:
3108         case SSH2_MSG_CHANNEL_DATA:
3109         case SSH2_MSG_CHANNEL_EOF:
3110         case SSH2_MSG_CHANNEL_EXTENDED_DATA:
3111         case SSH2_MSG_CHANNEL_OPEN_CONFIRMATION:
3112         case SSH2_MSG_CHANNEL_OPEN_FAILURE:
3113         case SSH2_MSG_CHANNEL_WINDOW_ADJUST:
3114         case SSH2_MSG_CHANNEL_SUCCESS:
3115         case SSH2_MSG_CHANNEL_FAILURE:
3116         case SSH2_MSG_CHANNEL_REQUEST:
3117                 break;
3118         default:
3119                 debug2_f("channel %u: unsupported type %u", c->self, type);
3120                 return 0;
3121         }
3122         if ((b = sshbuf_new()) == NULL) {
3123                 error_f("alloc reply");
3124                 goto out;
3125         }
3126         /* get remaining payload (after id) */
3127         cp = sshpkt_ptr(ssh, &len);
3128         if (cp == NULL) {
3129                 error_f("no packet");
3130                 goto out;
3131         }
3132         /* translate id and send to muxclient */
3133         if ((r = sshbuf_put_u8(b, 0)) != 0 ||   /* padlen */
3134             (r = sshbuf_put_u8(b, type)) != 0 ||
3135             (r = sshbuf_put_u32(b, c->mux_downstream_id)) != 0 ||
3136             (r = sshbuf_put(b, cp, len)) != 0 ||
3137             (r = sshbuf_put_stringb(downstream->output, b)) != 0) {
3138                 error_fr(r, "compose muxclient");
3139                 goto out;
3140         }
3141         /* sshbuf_dump(b, stderr); */
3142         if (ssh_packet_log_type(type))
3143                 debug3_f("channel %u: up->down: type %u", c->self, type);
3144  out:
3145         /* update state */
3146         switch (type) {
3147         case SSH2_MSG_CHANNEL_OPEN_CONFIRMATION:
3148                 /* record remote_id for SSH2_MSG_CHANNEL_CLOSE */
3149                 if (cp && len > 4) {
3150                         c->remote_id = PEEK_U32(cp);
3151                         c->have_remote_id = 1;
3152                 }
3153                 break;
3154         case SSH2_MSG_CHANNEL_CLOSE:
3155                 if (c->flags & CHAN_CLOSE_SENT)
3156                         channel_free(ssh, c);
3157                 else
3158                         c->flags |= CHAN_CLOSE_RCVD;
3159                 break;
3160         }
3161         sshbuf_free(b);
3162         return 1;
3163 }
3164
3165 /* -- protocol input */
3166
3167 /* Parse a channel ID from the current packet */
3168 static int
3169 channel_parse_id(struct ssh *ssh, const char *where, const char *what)
3170 {
3171         u_int32_t id;
3172         int r;
3173
3174         if ((r = sshpkt_get_u32(ssh, &id)) != 0) {
3175                 error_r(r, "%s: parse id", where);
3176                 ssh_packet_disconnect(ssh, "Invalid %s message", what);
3177         }
3178         if (id > INT_MAX) {
3179                 error_r(r, "%s: bad channel id %u", where, id);
3180                 ssh_packet_disconnect(ssh, "Invalid %s channel id", what);
3181         }
3182         return (int)id;
3183 }
3184
3185 /* Lookup a channel from an ID in the current packet */
3186 static Channel *
3187 channel_from_packet_id(struct ssh *ssh, const char *where, const char *what)
3188 {
3189         int id = channel_parse_id(ssh, where, what);
3190         Channel *c;
3191
3192         if ((c = channel_lookup(ssh, id)) == NULL) {
3193                 ssh_packet_disconnect(ssh,
3194                     "%s packet referred to nonexistent channel %d", what, id);
3195         }
3196         return c;
3197 }
3198
3199 int
3200 channel_input_data(int type, u_int32_t seq, struct ssh *ssh)
3201 {
3202         const u_char *data;
3203         size_t data_len, win_len;
3204         Channel *c = channel_from_packet_id(ssh, __func__, "data");
3205         int r;
3206
3207         if (channel_proxy_upstream(c, type, seq, ssh))
3208                 return 0;
3209
3210         /* Ignore any data for non-open channels (might happen on close) */
3211         if (c->type != SSH_CHANNEL_OPEN &&
3212             c->type != SSH_CHANNEL_RDYNAMIC_OPEN &&
3213             c->type != SSH_CHANNEL_RDYNAMIC_FINISH &&
3214             c->type != SSH_CHANNEL_X11_OPEN)
3215                 return 0;
3216
3217         /* Get the data. */
3218         if ((r = sshpkt_get_string_direct(ssh, &data, &data_len)) != 0 ||
3219             (r = sshpkt_get_end(ssh)) != 0)
3220                 fatal_fr(r, "channel %i: get data", c->self);
3221
3222         win_len = data_len;
3223         if (c->datagram)
3224                 win_len += 4;  /* string length header */
3225
3226         /*
3227          * The sending side reduces its window as it sends data, so we
3228          * must 'fake' consumption of the data in order to ensure that window
3229          * updates are sent back. Otherwise the connection might deadlock.
3230          */
3231         if (c->ostate != CHAN_OUTPUT_OPEN) {
3232                 c->local_window -= win_len;
3233                 c->local_consumed += win_len;
3234                 return 0;
3235         }
3236
3237         if (win_len > c->local_maxpacket) {
3238                 logit("channel %d: rcvd big packet %zu, maxpack %u",
3239                     c->self, win_len, c->local_maxpacket);
3240                 return 0;
3241         }
3242         if (win_len > c->local_window) {
3243                 logit("channel %d: rcvd too much data %zu, win %u",
3244                     c->self, win_len, c->local_window);
3245                 return 0;
3246         }
3247         c->local_window -= win_len;
3248
3249         if (c->datagram) {
3250                 if ((r = sshbuf_put_string(c->output, data, data_len)) != 0)
3251                         fatal_fr(r, "channel %i: append datagram", c->self);
3252         } else if ((r = sshbuf_put(c->output, data, data_len)) != 0)
3253                 fatal_fr(r, "channel %i: append data", c->self);
3254
3255         return 0;
3256 }
3257
3258 int
3259 channel_input_extended_data(int type, u_int32_t seq, struct ssh *ssh)
3260 {
3261         const u_char *data;
3262         size_t data_len;
3263         u_int32_t tcode;
3264         Channel *c = channel_from_packet_id(ssh, __func__, "extended data");
3265         int r;
3266
3267         if (channel_proxy_upstream(c, type, seq, ssh))
3268                 return 0;
3269         if (c->type != SSH_CHANNEL_OPEN) {
3270                 logit("channel %d: ext data for non open", c->self);
3271                 return 0;
3272         }
3273         if (c->flags & CHAN_EOF_RCVD) {
3274                 if (ssh->compat & SSH_BUG_EXTEOF)
3275                         debug("channel %d: accepting ext data after eof",
3276                             c->self);
3277                 else
3278                         ssh_packet_disconnect(ssh, "Received extended_data "
3279                             "after EOF on channel %d.", c->self);
3280         }
3281
3282         if ((r = sshpkt_get_u32(ssh, &tcode)) != 0) {
3283                 error_fr(r, "parse tcode");
3284                 ssh_packet_disconnect(ssh, "Invalid extended_data message");
3285         }
3286         if (c->efd == -1 ||
3287             c->extended_usage != CHAN_EXTENDED_WRITE ||
3288             tcode != SSH2_EXTENDED_DATA_STDERR) {
3289                 logit("channel %d: bad ext data", c->self);
3290                 return 0;
3291         }
3292         if ((r = sshpkt_get_string_direct(ssh, &data, &data_len)) != 0 ||
3293             (r = sshpkt_get_end(ssh)) != 0) {
3294                 error_fr(r, "parse data");
3295                 ssh_packet_disconnect(ssh, "Invalid extended_data message");
3296         }
3297
3298         if (data_len > c->local_window) {
3299                 logit("channel %d: rcvd too much extended_data %zu, win %u",
3300                     c->self, data_len, c->local_window);
3301                 return 0;
3302         }
3303         debug2("channel %d: rcvd ext data %zu", c->self, data_len);
3304         /* XXX sshpkt_getb? */
3305         if ((r = sshbuf_put(c->extended, data, data_len)) != 0)
3306                 error_fr(r, "append");
3307         c->local_window -= data_len;
3308         return 0;
3309 }
3310
3311 int
3312 channel_input_ieof(int type, u_int32_t seq, struct ssh *ssh)
3313 {
3314         Channel *c = channel_from_packet_id(ssh, __func__, "ieof");
3315         int r;
3316
3317         if ((r = sshpkt_get_end(ssh)) != 0) {
3318                 error_fr(r, "parse data");
3319                 ssh_packet_disconnect(ssh, "Invalid ieof message");
3320         }
3321
3322         if (channel_proxy_upstream(c, type, seq, ssh))
3323                 return 0;
3324         chan_rcvd_ieof(ssh, c);
3325
3326         /* XXX force input close */
3327         if (c->force_drain && c->istate == CHAN_INPUT_OPEN) {
3328                 debug("channel %d: FORCE input drain", c->self);
3329                 c->istate = CHAN_INPUT_WAIT_DRAIN;
3330                 if (sshbuf_len(c->input) == 0)
3331                         chan_ibuf_empty(ssh, c);
3332         }
3333         return 0;
3334 }
3335
3336 int
3337 channel_input_oclose(int type, u_int32_t seq, struct ssh *ssh)
3338 {
3339         Channel *c = channel_from_packet_id(ssh, __func__, "oclose");
3340         int r;
3341
3342         if (channel_proxy_upstream(c, type, seq, ssh))
3343                 return 0;
3344         if ((r = sshpkt_get_end(ssh)) != 0) {
3345                 error_fr(r, "parse data");
3346                 ssh_packet_disconnect(ssh, "Invalid oclose message");
3347         }
3348         chan_rcvd_oclose(ssh, c);
3349         return 0;
3350 }
3351
3352 int
3353 channel_input_open_confirmation(int type, u_int32_t seq, struct ssh *ssh)
3354 {
3355         Channel *c = channel_from_packet_id(ssh, __func__, "open confirmation");
3356         u_int32_t remote_window, remote_maxpacket;
3357         int r;
3358
3359         if (channel_proxy_upstream(c, type, seq, ssh))
3360                 return 0;
3361         if (c->type != SSH_CHANNEL_OPENING)
3362                 ssh_packet_disconnect(ssh, "Received open confirmation for "
3363                     "non-opening channel %d.", c->self);
3364         /*
3365          * Record the remote channel number and mark that the channel
3366          * is now open.
3367          */
3368         if ((r = sshpkt_get_u32(ssh, &c->remote_id)) != 0 ||
3369             (r = sshpkt_get_u32(ssh, &remote_window)) != 0 ||
3370             (r = sshpkt_get_u32(ssh, &remote_maxpacket)) != 0 ||
3371             (r = sshpkt_get_end(ssh)) != 0) {
3372                 error_fr(r, "window/maxpacket");
3373                 ssh_packet_disconnect(ssh, "Invalid open confirmation message");
3374         }
3375
3376         c->have_remote_id = 1;
3377         c->remote_window = remote_window;
3378         c->remote_maxpacket = remote_maxpacket;
3379         c->type = SSH_CHANNEL_OPEN;
3380         if (c->open_confirm) {
3381                 debug2_f("channel %d: callback start", c->self);
3382                 c->open_confirm(ssh, c->self, 1, c->open_confirm_ctx);
3383                 debug2_f("channel %d: callback done", c->self);
3384         }
3385         debug2("channel %d: open confirm rwindow %u rmax %u", c->self,
3386             c->remote_window, c->remote_maxpacket);
3387         return 0;
3388 }
3389
3390 static char *
3391 reason2txt(int reason)
3392 {
3393         switch (reason) {
3394         case SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED:
3395                 return "administratively prohibited";
3396         case SSH2_OPEN_CONNECT_FAILED:
3397                 return "connect failed";
3398         case SSH2_OPEN_UNKNOWN_CHANNEL_TYPE:
3399                 return "unknown channel type";
3400         case SSH2_OPEN_RESOURCE_SHORTAGE:
3401                 return "resource shortage";
3402         }
3403         return "unknown reason";
3404 }
3405
3406 int
3407 channel_input_open_failure(int type, u_int32_t seq, struct ssh *ssh)
3408 {
3409         Channel *c = channel_from_packet_id(ssh, __func__, "open failure");
3410         u_int32_t reason;
3411         char *msg = NULL;
3412         int r;
3413
3414         if (channel_proxy_upstream(c, type, seq, ssh))
3415                 return 0;
3416         if (c->type != SSH_CHANNEL_OPENING)
3417                 ssh_packet_disconnect(ssh, "Received open failure for "
3418                     "non-opening channel %d.", c->self);
3419         if ((r = sshpkt_get_u32(ssh, &reason)) != 0) {
3420                 error_fr(r, "parse reason");
3421                 ssh_packet_disconnect(ssh, "Invalid open failure message");
3422         }
3423         /* skip language */
3424         if ((r = sshpkt_get_cstring(ssh, &msg, NULL)) != 0 ||
3425             (r = sshpkt_get_string_direct(ssh, NULL, NULL)) != 0 ||
3426             (r = sshpkt_get_end(ssh)) != 0) {
3427                 error_fr(r, "parse msg/lang");
3428                 ssh_packet_disconnect(ssh, "Invalid open failure message");
3429         }
3430         logit("channel %d: open failed: %s%s%s", c->self,
3431             reason2txt(reason), msg ? ": ": "", msg ? msg : "");
3432         free(msg);
3433         if (c->open_confirm) {
3434                 debug2_f("channel %d: callback start", c->self);
3435                 c->open_confirm(ssh, c->self, 0, c->open_confirm_ctx);
3436                 debug2_f("channel %d: callback done", c->self);
3437         }
3438         /* Schedule the channel for cleanup/deletion. */
3439         chan_mark_dead(ssh, c);
3440         return 0;
3441 }
3442
3443 int
3444 channel_input_window_adjust(int type, u_int32_t seq, struct ssh *ssh)
3445 {
3446         int id = channel_parse_id(ssh, __func__, "window adjust");
3447         Channel *c;
3448         u_int32_t adjust;
3449         u_int new_rwin;
3450         int r;
3451
3452         if ((c = channel_lookup(ssh, id)) == NULL) {
3453                 logit("Received window adjust for non-open channel %d.", id);
3454                 return 0;
3455         }
3456
3457         if (channel_proxy_upstream(c, type, seq, ssh))
3458                 return 0;
3459         if ((r = sshpkt_get_u32(ssh, &adjust)) != 0 ||
3460             (r = sshpkt_get_end(ssh)) != 0) {
3461                 error_fr(r, "parse adjust");
3462                 ssh_packet_disconnect(ssh, "Invalid window adjust message");
3463         }
3464         debug2("channel %d: rcvd adjust %u", c->self, adjust);
3465         if ((new_rwin = c->remote_window + adjust) < c->remote_window) {
3466                 fatal("channel %d: adjust %u overflows remote window %u",
3467                     c->self, adjust, c->remote_window);
3468         }
3469         c->remote_window = new_rwin;
3470         return 0;
3471 }
3472
3473 int
3474 channel_input_status_confirm(int type, u_int32_t seq, struct ssh *ssh)
3475 {
3476         int id = channel_parse_id(ssh, __func__, "status confirm");
3477         Channel *c;
3478         struct channel_confirm *cc;
3479
3480         /* Reset keepalive timeout */
3481         ssh_packet_set_alive_timeouts(ssh, 0);
3482
3483         debug2_f("type %d id %d", type, id);
3484
3485         if ((c = channel_lookup(ssh, id)) == NULL) {
3486                 logit_f("%d: unknown", id);
3487                 return 0;
3488         }
3489         if (channel_proxy_upstream(c, type, seq, ssh))
3490                 return 0;
3491         if (sshpkt_get_end(ssh) != 0)
3492                 ssh_packet_disconnect(ssh, "Invalid status confirm message");
3493         if ((cc = TAILQ_FIRST(&c->status_confirms)) == NULL)
3494                 return 0;
3495         cc->cb(ssh, type, c, cc->ctx);
3496         TAILQ_REMOVE(&c->status_confirms, cc, entry);
3497         freezero(cc, sizeof(*cc));
3498         return 0;
3499 }
3500
3501 /* -- tcp forwarding */
3502
3503 void
3504 channel_set_af(struct ssh *ssh, int af)
3505 {
3506         ssh->chanctxt->IPv4or6 = af;
3507 }
3508
3509
3510 /*
3511  * Determine whether or not a port forward listens to loopback, the
3512  * specified address or wildcard. On the client, a specified bind
3513  * address will always override gateway_ports. On the server, a
3514  * gateway_ports of 1 (``yes'') will override the client's specification
3515  * and force a wildcard bind, whereas a value of 2 (``clientspecified'')
3516  * will bind to whatever address the client asked for.
3517  *
3518  * Special-case listen_addrs are:
3519  *
3520  * "0.0.0.0"               -> wildcard v4/v6 if SSH_OLD_FORWARD_ADDR
3521  * "" (empty string), "*"  -> wildcard v4/v6
3522  * "localhost"             -> loopback v4/v6
3523  * "127.0.0.1" / "::1"     -> accepted even if gateway_ports isn't set
3524  */
3525 static const char *
3526 channel_fwd_bind_addr(struct ssh *ssh, const char *listen_addr, int *wildcardp,
3527     int is_client, struct ForwardOptions *fwd_opts)
3528 {
3529         const char *addr = NULL;
3530         int wildcard = 0;
3531
3532         if (listen_addr == NULL) {
3533                 /* No address specified: default to gateway_ports setting */
3534                 if (fwd_opts->gateway_ports)
3535                         wildcard = 1;
3536         } else if (fwd_opts->gateway_ports || is_client) {
3537                 if (((ssh->compat & SSH_OLD_FORWARD_ADDR) &&
3538                     strcmp(listen_addr, "0.0.0.0") == 0 && is_client == 0) ||
3539                     *listen_addr == '\0' || strcmp(listen_addr, "*") == 0 ||
3540                     (!is_client && fwd_opts->gateway_ports == 1)) {
3541                         wildcard = 1;
3542                         /*
3543                          * Notify client if they requested a specific listen
3544                          * address and it was overridden.
3545                          */
3546                         if (*listen_addr != '\0' &&
3547                             strcmp(listen_addr, "0.0.0.0") != 0 &&
3548                             strcmp(listen_addr, "*") != 0) {
3549                                 ssh_packet_send_debug(ssh,
3550                                     "Forwarding listen address "
3551                                     "\"%s\" overridden by server "
3552                                     "GatewayPorts", listen_addr);
3553                         }
3554                 } else if (strcmp(listen_addr, "localhost") != 0 ||
3555                     strcmp(listen_addr, "127.0.0.1") == 0 ||
3556                     strcmp(listen_addr, "::1") == 0) {
3557                         /*
3558                          * Accept explicit localhost address when
3559                          * GatewayPorts=yes. The "localhost" hostname is
3560                          * deliberately skipped here so it will listen on all
3561                          * available local address families.
3562                          */
3563                         addr = listen_addr;
3564                 }
3565         } else if (strcmp(listen_addr, "127.0.0.1") == 0 ||
3566             strcmp(listen_addr, "::1") == 0) {
3567                 /*
3568                  * If a specific IPv4/IPv6 localhost address has been
3569                  * requested then accept it even if gateway_ports is in
3570                  * effect. This allows the client to prefer IPv4 or IPv6.
3571                  */
3572                 addr = listen_addr;
3573         }
3574         if (wildcardp != NULL)
3575                 *wildcardp = wildcard;
3576         return addr;
3577 }
3578
3579 static int
3580 channel_setup_fwd_listener_tcpip(struct ssh *ssh, int type,
3581     struct Forward *fwd, int *allocated_listen_port,
3582     struct ForwardOptions *fwd_opts)
3583 {
3584         Channel *c;
3585         int sock, r, success = 0, wildcard = 0, is_client;
3586         struct addrinfo hints, *ai, *aitop;
3587         const char *host, *addr;
3588         char ntop[NI_MAXHOST], strport[NI_MAXSERV];
3589         in_port_t *lport_p;
3590
3591         is_client = (type == SSH_CHANNEL_PORT_LISTENER);
3592
3593         if (is_client && fwd->connect_path != NULL) {
3594                 host = fwd->connect_path;
3595         } else {
3596                 host = (type == SSH_CHANNEL_RPORT_LISTENER) ?
3597                     fwd->listen_host : fwd->connect_host;
3598                 if (host == NULL) {
3599                         error("No forward host name.");
3600                         return 0;
3601                 }
3602                 if (strlen(host) >= NI_MAXHOST) {
3603                         error("Forward host name too long.");
3604                         return 0;
3605                 }
3606         }
3607
3608         /* Determine the bind address, cf. channel_fwd_bind_addr() comment */
3609         addr = channel_fwd_bind_addr(ssh, fwd->listen_host, &wildcard,
3610             is_client, fwd_opts);
3611         debug3_f("type %d wildcard %d addr %s", type, wildcard,
3612             (addr == NULL) ? "NULL" : addr);
3613
3614         /*
3615          * getaddrinfo returns a loopback address if the hostname is
3616          * set to NULL and hints.ai_flags is not AI_PASSIVE
3617          */
3618         memset(&hints, 0, sizeof(hints));
3619         hints.ai_family = ssh->chanctxt->IPv4or6;
3620         hints.ai_flags = wildcard ? AI_PASSIVE : 0;
3621         hints.ai_socktype = SOCK_STREAM;
3622         snprintf(strport, sizeof strport, "%d", fwd->listen_port);
3623         if ((r = getaddrinfo(addr, strport, &hints, &aitop)) != 0) {
3624                 if (addr == NULL) {
3625                         /* This really shouldn't happen */
3626                         ssh_packet_disconnect(ssh, "getaddrinfo: fatal error: %s",
3627                             ssh_gai_strerror(r));
3628                 } else {
3629                         error_f("getaddrinfo(%.64s): %s", addr,
3630                             ssh_gai_strerror(r));
3631                 }
3632                 return 0;
3633         }
3634         if (allocated_listen_port != NULL)
3635                 *allocated_listen_port = 0;
3636         for (ai = aitop; ai; ai = ai->ai_next) {
3637                 switch (ai->ai_family) {
3638                 case AF_INET:
3639                         lport_p = &((struct sockaddr_in *)ai->ai_addr)->
3640                             sin_port;
3641                         break;
3642                 case AF_INET6:
3643                         lport_p = &((struct sockaddr_in6 *)ai->ai_addr)->
3644                             sin6_port;
3645                         break;
3646                 default:
3647                         continue;
3648                 }
3649                 /*
3650                  * If allocating a port for -R forwards, then use the
3651                  * same port for all address families.
3652                  */
3653                 if (type == SSH_CHANNEL_RPORT_LISTENER &&
3654                     fwd->listen_port == 0 && allocated_listen_port != NULL &&
3655                     *allocated_listen_port > 0)
3656                         *lport_p = htons(*allocated_listen_port);
3657
3658                 if (getnameinfo(ai->ai_addr, ai->ai_addrlen, ntop, sizeof(ntop),
3659                     strport, sizeof(strport),
3660                     NI_NUMERICHOST|NI_NUMERICSERV) != 0) {
3661                         error_f("getnameinfo failed");
3662                         continue;
3663                 }
3664                 /* Create a port to listen for the host. */
3665                 sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
3666                 if (sock == -1) {
3667                         /* this is no error since kernel may not support ipv6 */
3668                         verbose("socket [%s]:%s: %.100s", ntop, strport,
3669                             strerror(errno));
3670                         continue;
3671                 }
3672
3673                 set_reuseaddr(sock);
3674                 if (ai->ai_family == AF_INET6)
3675                         sock_set_v6only(sock);
3676
3677                 debug("Local forwarding listening on %s port %s.",
3678                     ntop, strport);
3679
3680                 /* Bind the socket to the address. */
3681                 if (bind(sock, ai->ai_addr, ai->ai_addrlen) == -1) {
3682                         /*
3683                          * address can be in if use ipv6 address is
3684                          * already bound
3685                          */
3686                         if (!ai->ai_next)
3687                                 error("bind [%s]:%s: %.100s",
3688                                     ntop, strport, strerror(errno));
3689                         else
3690                                 verbose("bind [%s]:%s: %.100s",
3691                                     ntop, strport, strerror(errno));
3692
3693                         close(sock);
3694                         continue;
3695                 }
3696                 /* Start listening for connections on the socket. */
3697                 if (listen(sock, SSH_LISTEN_BACKLOG) == -1) {
3698                         error("listen [%s]:%s: %.100s", ntop, strport,
3699                             strerror(errno));
3700                         close(sock);
3701                         continue;
3702                 }
3703
3704                 /*
3705                  * fwd->listen_port == 0 requests a dynamically allocated port -
3706                  * record what we got.
3707                  */
3708                 if (type == SSH_CHANNEL_RPORT_LISTENER &&
3709                     fwd->listen_port == 0 &&
3710                     allocated_listen_port != NULL &&
3711                     *allocated_listen_port == 0) {
3712                         *allocated_listen_port = get_local_port(sock);
3713                         debug("Allocated listen port %d",
3714                             *allocated_listen_port);
3715                 }
3716
3717                 /* Allocate a channel number for the socket. */
3718                 c = channel_new(ssh, "port listener", type, sock, sock, -1,
3719                     CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT,
3720                     0, "port listener", 1);
3721                 c->path = xstrdup(host);
3722                 c->host_port = fwd->connect_port;
3723                 c->listening_addr = addr == NULL ? NULL : xstrdup(addr);
3724                 if (fwd->listen_port == 0 && allocated_listen_port != NULL &&
3725                     !(ssh->compat & SSH_BUG_DYNAMIC_RPORT))
3726                         c->listening_port = *allocated_listen_port;
3727                 else
3728                         c->listening_port = fwd->listen_port;
3729                 success = 1;
3730         }
3731         if (success == 0)
3732                 error_f("cannot listen to port: %d", fwd->listen_port);
3733         freeaddrinfo(aitop);
3734         return success;
3735 }
3736
3737 static int
3738 channel_setup_fwd_listener_streamlocal(struct ssh *ssh, int type,
3739     struct Forward *fwd, struct ForwardOptions *fwd_opts)
3740 {
3741         struct sockaddr_un sunaddr;
3742         const char *path;
3743         Channel *c;
3744         int port, sock;
3745         mode_t omask;
3746
3747         switch (type) {
3748         case SSH_CHANNEL_UNIX_LISTENER:
3749                 if (fwd->connect_path != NULL) {
3750                         if (strlen(fwd->connect_path) > sizeof(sunaddr.sun_path)) {
3751                                 error("Local connecting path too long: %s",
3752                                     fwd->connect_path);
3753                                 return 0;
3754                         }
3755                         path = fwd->connect_path;
3756                         port = PORT_STREAMLOCAL;
3757                 } else {
3758                         if (fwd->connect_host == NULL) {
3759                                 error("No forward host name.");
3760                                 return 0;
3761                         }
3762                         if (strlen(fwd->connect_host) >= NI_MAXHOST) {
3763                                 error("Forward host name too long.");
3764                                 return 0;
3765                         }
3766                         path = fwd->connect_host;
3767                         port = fwd->connect_port;
3768                 }
3769                 break;
3770         case SSH_CHANNEL_RUNIX_LISTENER:
3771                 path = fwd->listen_path;
3772                 port = PORT_STREAMLOCAL;
3773                 break;
3774         default:
3775                 error_f("unexpected channel type %d", type);
3776                 return 0;
3777         }
3778
3779         if (fwd->listen_path == NULL) {
3780                 error("No forward path name.");
3781                 return 0;
3782         }
3783         if (strlen(fwd->listen_path) > sizeof(sunaddr.sun_path)) {
3784                 error("Local listening path too long: %s", fwd->listen_path);
3785                 return 0;
3786         }
3787
3788         debug3_f("type %d path %s", type, fwd->listen_path);
3789
3790         /* Start a Unix domain listener. */
3791         omask = umask(fwd_opts->streamlocal_bind_mask);
3792         sock = unix_listener(fwd->listen_path, SSH_LISTEN_BACKLOG,
3793             fwd_opts->streamlocal_bind_unlink);
3794         umask(omask);
3795         if (sock < 0)
3796                 return 0;
3797
3798         debug("Local forwarding listening on path %s.", fwd->listen_path);
3799
3800         /* Allocate a channel number for the socket. */
3801         c = channel_new(ssh, "unix listener", type, sock, sock, -1,
3802             CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT,
3803             0, "unix listener", 1);
3804         c->path = xstrdup(path);
3805         c->host_port = port;
3806         c->listening_port = PORT_STREAMLOCAL;
3807         c->listening_addr = xstrdup(fwd->listen_path);
3808         return 1;
3809 }
3810
3811 static int
3812 channel_cancel_rport_listener_tcpip(struct ssh *ssh,
3813     const char *host, u_short port)
3814 {
3815         u_int i;
3816         int found = 0;
3817
3818         for (i = 0; i < ssh->chanctxt->channels_alloc; i++) {
3819                 Channel *c = ssh->chanctxt->channels[i];
3820                 if (c == NULL || c->type != SSH_CHANNEL_RPORT_LISTENER)
3821                         continue;
3822                 if (strcmp(c->path, host) == 0 && c->listening_port == port) {
3823                         debug2_f("close channel %d", i);
3824                         channel_free(ssh, c);
3825                         found = 1;
3826                 }
3827         }
3828
3829         return found;
3830 }
3831
3832 static int
3833 channel_cancel_rport_listener_streamlocal(struct ssh *ssh, const char *path)
3834 {
3835         u_int i;
3836         int found = 0;
3837
3838         for (i = 0; i < ssh->chanctxt->channels_alloc; i++) {
3839                 Channel *c = ssh->chanctxt->channels[i];
3840                 if (c == NULL || c->type != SSH_CHANNEL_RUNIX_LISTENER)
3841                         continue;
3842                 if (c->path == NULL)
3843                         continue;
3844                 if (strcmp(c->path, path) == 0) {
3845                         debug2_f("close channel %d", i);
3846                         channel_free(ssh, c);
3847                         found = 1;
3848                 }
3849         }
3850
3851         return found;
3852 }
3853
3854 int
3855 channel_cancel_rport_listener(struct ssh *ssh, struct Forward *fwd)
3856 {
3857         if (fwd->listen_path != NULL) {
3858                 return channel_cancel_rport_listener_streamlocal(ssh,
3859                     fwd->listen_path);
3860         } else {
3861                 return channel_cancel_rport_listener_tcpip(ssh,
3862                     fwd->listen_host, fwd->listen_port);
3863         }
3864 }
3865
3866 static int
3867 channel_cancel_lport_listener_tcpip(struct ssh *ssh,
3868     const char *lhost, u_short lport, int cport,
3869     struct ForwardOptions *fwd_opts)
3870 {
3871         u_int i;
3872         int found = 0;
3873         const char *addr = channel_fwd_bind_addr(ssh, lhost, NULL, 1, fwd_opts);
3874
3875         for (i = 0; i < ssh->chanctxt->channels_alloc; i++) {
3876                 Channel *c = ssh->chanctxt->channels[i];
3877                 if (c == NULL || c->type != SSH_CHANNEL_PORT_LISTENER)
3878                         continue;
3879                 if (c->listening_port != lport)
3880                         continue;
3881                 if (cport == CHANNEL_CANCEL_PORT_STATIC) {
3882                         /* skip dynamic forwardings */
3883                         if (c->host_port == 0)
3884                                 continue;
3885                 } else {
3886                         if (c->host_port != cport)
3887                                 continue;
3888                 }
3889                 if ((c->listening_addr == NULL && addr != NULL) ||
3890                     (c->listening_addr != NULL && addr == NULL))
3891                         continue;
3892                 if (addr == NULL || strcmp(c->listening_addr, addr) == 0) {
3893                         debug2_f("close channel %d", i);
3894                         channel_free(ssh, c);
3895                         found = 1;
3896                 }
3897         }
3898
3899         return found;
3900 }
3901
3902 static int
3903 channel_cancel_lport_listener_streamlocal(struct ssh *ssh, const char *path)
3904 {
3905         u_int i;
3906         int found = 0;
3907
3908         if (path == NULL) {
3909                 error_f("no path specified.");
3910                 return 0;
3911         }
3912
3913         for (i = 0; i < ssh->chanctxt->channels_alloc; i++) {
3914                 Channel *c = ssh->chanctxt->channels[i];
3915                 if (c == NULL || c->type != SSH_CHANNEL_UNIX_LISTENER)
3916                         continue;
3917                 if (c->listening_addr == NULL)
3918                         continue;
3919                 if (strcmp(c->listening_addr, path) == 0) {
3920                         debug2_f("close channel %d", i);
3921                         channel_free(ssh, c);
3922                         found = 1;
3923                 }
3924         }
3925
3926         return found;
3927 }
3928
3929 int
3930 channel_cancel_lport_listener(struct ssh *ssh,
3931     struct Forward *fwd, int cport, struct ForwardOptions *fwd_opts)
3932 {
3933         if (fwd->listen_path != NULL) {
3934                 return channel_cancel_lport_listener_streamlocal(ssh,
3935                     fwd->listen_path);
3936         } else {
3937                 return channel_cancel_lport_listener_tcpip(ssh,
3938                     fwd->listen_host, fwd->listen_port, cport, fwd_opts);
3939         }
3940 }
3941
3942 /* protocol local port fwd, used by ssh */
3943 int
3944 channel_setup_local_fwd_listener(struct ssh *ssh,
3945     struct Forward *fwd, struct ForwardOptions *fwd_opts)
3946 {
3947         if (fwd->listen_path != NULL) {
3948                 return channel_setup_fwd_listener_streamlocal(ssh,
3949                     SSH_CHANNEL_UNIX_LISTENER, fwd, fwd_opts);
3950         } else {
3951                 return channel_setup_fwd_listener_tcpip(ssh,
3952                     SSH_CHANNEL_PORT_LISTENER, fwd, NULL, fwd_opts);
3953         }
3954 }
3955
3956 /* Matches a remote forwarding permission against a requested forwarding */
3957 static int
3958 remote_open_match(struct permission *allowed_open, struct Forward *fwd)
3959 {
3960         int ret;
3961         char *lhost;
3962
3963         /* XXX add ACLs for streamlocal */
3964         if (fwd->listen_path != NULL)
3965                 return 1;
3966
3967         if (fwd->listen_host == NULL || allowed_open->listen_host == NULL)
3968                 return 0;
3969
3970         if (allowed_open->listen_port != FWD_PERMIT_ANY_PORT &&
3971             allowed_open->listen_port != fwd->listen_port)
3972                 return 0;
3973
3974         /* Match hostnames case-insensitively */
3975         lhost = xstrdup(fwd->listen_host);
3976         lowercase(lhost);
3977         ret = match_pattern(lhost, allowed_open->listen_host);
3978         free(lhost);
3979
3980         return ret;
3981 }
3982
3983 /* Checks whether a requested remote forwarding is permitted */
3984 static int
3985 check_rfwd_permission(struct ssh *ssh, struct Forward *fwd)
3986 {
3987         struct ssh_channels *sc = ssh->chanctxt;
3988         struct permission_set *pset = &sc->remote_perms;
3989         u_int i, permit, permit_adm = 1;
3990         struct permission *perm;
3991
3992         /* XXX apply GatewayPorts override before checking? */
3993
3994         permit = pset->all_permitted;
3995         if (!permit) {
3996                 for (i = 0; i < pset->num_permitted_user; i++) {
3997                         perm = &pset->permitted_user[i];
3998                         if (remote_open_match(perm, fwd)) {
3999                                 permit = 1;
4000                                 break;
4001                         }
4002                 }
4003         }
4004
4005         if (pset->num_permitted_admin > 0) {
4006                 permit_adm = 0;
4007                 for (i = 0; i < pset->num_permitted_admin; i++) {
4008                         perm = &pset->permitted_admin[i];
4009                         if (remote_open_match(perm, fwd)) {
4010                                 permit_adm = 1;
4011                                 break;
4012                         }
4013                 }
4014         }
4015
4016         return permit && permit_adm;
4017 }
4018
4019 /* protocol v2 remote port fwd, used by sshd */
4020 int
4021 channel_setup_remote_fwd_listener(struct ssh *ssh, struct Forward *fwd,
4022     int *allocated_listen_port, struct ForwardOptions *fwd_opts)
4023 {
4024         if (!check_rfwd_permission(ssh, fwd)) {
4025                 ssh_packet_send_debug(ssh, "port forwarding refused");
4026                 if (fwd->listen_path != NULL)
4027                         /* XXX always allowed, see remote_open_match() */
4028                         logit("Received request from %.100s port %d to "
4029                             "remote forward to path \"%.100s\", "
4030                             "but the request was denied.",
4031                             ssh_remote_ipaddr(ssh), ssh_remote_port(ssh),
4032                             fwd->listen_path);
4033                 else if(fwd->listen_host != NULL)
4034                         logit("Received request from %.100s port %d to "
4035                             "remote forward to host %.100s port %d, "
4036                             "but the request was denied.",
4037                             ssh_remote_ipaddr(ssh), ssh_remote_port(ssh),
4038                             fwd->listen_host, fwd->listen_port );
4039                 else
4040                         logit("Received request from %.100s port %d to remote "
4041                             "forward, but the request was denied.",
4042                             ssh_remote_ipaddr(ssh), ssh_remote_port(ssh));
4043                 return 0;
4044         }
4045         if (fwd->listen_path != NULL) {
4046                 return channel_setup_fwd_listener_streamlocal(ssh,
4047                     SSH_CHANNEL_RUNIX_LISTENER, fwd, fwd_opts);
4048         } else {
4049                 return channel_setup_fwd_listener_tcpip(ssh,
4050                     SSH_CHANNEL_RPORT_LISTENER, fwd, allocated_listen_port,
4051                     fwd_opts);
4052         }
4053 }
4054
4055 /*
4056  * Translate the requested rfwd listen host to something usable for
4057  * this server.
4058  */
4059 static const char *
4060 channel_rfwd_bind_host(const char *listen_host)
4061 {
4062         if (listen_host == NULL) {
4063                 return "localhost";
4064         } else if (*listen_host == '\0' || strcmp(listen_host, "*") == 0) {
4065                 return "";
4066         } else
4067                 return listen_host;
4068 }
4069
4070 /*
4071  * Initiate forwarding of connections to port "port" on remote host through
4072  * the secure channel to host:port from local side.
4073  * Returns handle (index) for updating the dynamic listen port with
4074  * channel_update_permission().
4075  */
4076 int
4077 channel_request_remote_forwarding(struct ssh *ssh, struct Forward *fwd)
4078 {
4079         int r, success = 0, idx = -1;
4080         char *host_to_connect, *listen_host, *listen_path;
4081         int port_to_connect, listen_port;
4082
4083         /* Send the forward request to the remote side. */
4084         if (fwd->listen_path != NULL) {
4085                 if ((r = sshpkt_start(ssh, SSH2_MSG_GLOBAL_REQUEST)) != 0 ||
4086                     (r = sshpkt_put_cstring(ssh,
4087                     "streamlocal-forward@openssh.com")) != 0 ||
4088                     (r = sshpkt_put_u8(ssh, 1)) != 0 || /* want reply */
4089                     (r = sshpkt_put_cstring(ssh, fwd->listen_path)) != 0 ||
4090                     (r = sshpkt_send(ssh)) != 0 ||
4091                     (r = ssh_packet_write_wait(ssh)) != 0)
4092                         fatal_fr(r, "request streamlocal");
4093         } else {
4094                 if ((r = sshpkt_start(ssh, SSH2_MSG_GLOBAL_REQUEST)) != 0 ||
4095                     (r = sshpkt_put_cstring(ssh, "tcpip-forward")) != 0 ||
4096                     (r = sshpkt_put_u8(ssh, 1)) != 0 || /* want reply */
4097                     (r = sshpkt_put_cstring(ssh,
4098                     channel_rfwd_bind_host(fwd->listen_host))) != 0 ||
4099                     (r = sshpkt_put_u32(ssh, fwd->listen_port)) != 0 ||
4100                     (r = sshpkt_send(ssh)) != 0 ||
4101                     (r = ssh_packet_write_wait(ssh)) != 0)
4102                         fatal_fr(r, "request tcpip-forward");
4103         }
4104         /* Assume that server accepts the request */
4105         success = 1;
4106         if (success) {
4107                 /* Record that connection to this host/port is permitted. */
4108                 host_to_connect = listen_host = listen_path = NULL;
4109                 port_to_connect = listen_port = 0;
4110                 if (fwd->connect_path != NULL) {
4111                         host_to_connect = xstrdup(fwd->connect_path);
4112                         port_to_connect = PORT_STREAMLOCAL;
4113                 } else {
4114                         host_to_connect = xstrdup(fwd->connect_host);
4115                         port_to_connect = fwd->connect_port;
4116                 }
4117                 if (fwd->listen_path != NULL) {
4118                         listen_path = xstrdup(fwd->listen_path);
4119                         listen_port = PORT_STREAMLOCAL;
4120                 } else {
4121                         if (fwd->listen_host != NULL)
4122                                 listen_host = xstrdup(fwd->listen_host);
4123                         listen_port = fwd->listen_port;
4124                 }
4125                 idx = permission_set_add(ssh, FORWARD_USER, FORWARD_LOCAL,
4126                     host_to_connect, port_to_connect,
4127                     listen_host, listen_path, listen_port, NULL);
4128         }
4129         return idx;
4130 }
4131
4132 static int
4133 open_match(struct permission *allowed_open, const char *requestedhost,
4134     int requestedport)
4135 {
4136         if (allowed_open->host_to_connect == NULL)
4137                 return 0;
4138         if (allowed_open->port_to_connect != FWD_PERMIT_ANY_PORT &&
4139             allowed_open->port_to_connect != requestedport)
4140                 return 0;
4141         if (strcmp(allowed_open->host_to_connect, FWD_PERMIT_ANY_HOST) != 0 &&
4142             strcmp(allowed_open->host_to_connect, requestedhost) != 0)
4143                 return 0;
4144         return 1;
4145 }
4146
4147 /*
4148  * Note that in the listen host/port case
4149  * we don't support FWD_PERMIT_ANY_PORT and
4150  * need to translate between the configured-host (listen_host)
4151  * and what we've sent to the remote server (channel_rfwd_bind_host)
4152  */
4153 static int
4154 open_listen_match_tcpip(struct permission *allowed_open,
4155     const char *requestedhost, u_short requestedport, int translate)
4156 {
4157         const char *allowed_host;
4158
4159         if (allowed_open->host_to_connect == NULL)
4160                 return 0;
4161         if (allowed_open->listen_port != requestedport)
4162                 return 0;
4163         if (!translate && allowed_open->listen_host == NULL &&
4164             requestedhost == NULL)
4165                 return 1;
4166         allowed_host = translate ?
4167             channel_rfwd_bind_host(allowed_open->listen_host) :
4168             allowed_open->listen_host;
4169         if (allowed_host == NULL || requestedhost == NULL ||
4170             strcmp(allowed_host, requestedhost) != 0)
4171                 return 0;
4172         return 1;
4173 }
4174
4175 static int
4176 open_listen_match_streamlocal(struct permission *allowed_open,
4177     const char *requestedpath)
4178 {
4179         if (allowed_open->host_to_connect == NULL)
4180                 return 0;
4181         if (allowed_open->listen_port != PORT_STREAMLOCAL)
4182                 return 0;
4183         if (allowed_open->listen_path == NULL ||
4184             strcmp(allowed_open->listen_path, requestedpath) != 0)
4185                 return 0;
4186         return 1;
4187 }
4188
4189 /*
4190  * Request cancellation of remote forwarding of connection host:port from
4191  * local side.
4192  */
4193 static int
4194 channel_request_rforward_cancel_tcpip(struct ssh *ssh,
4195     const char *host, u_short port)
4196 {
4197         struct ssh_channels *sc = ssh->chanctxt;
4198         struct permission_set *pset = &sc->local_perms;
4199         int r;
4200         u_int i;
4201         struct permission *perm = NULL;
4202
4203         for (i = 0; i < pset->num_permitted_user; i++) {
4204                 perm = &pset->permitted_user[i];
4205                 if (open_listen_match_tcpip(perm, host, port, 0))
4206                         break;
4207                 perm = NULL;
4208         }
4209         if (perm == NULL) {
4210                 debug_f("requested forward not found");
4211                 return -1;
4212         }
4213         if ((r = sshpkt_start(ssh, SSH2_MSG_GLOBAL_REQUEST)) != 0 ||
4214             (r = sshpkt_put_cstring(ssh, "cancel-tcpip-forward")) != 0 ||
4215             (r = sshpkt_put_u8(ssh, 0)) != 0 || /* want reply */
4216             (r = sshpkt_put_cstring(ssh, channel_rfwd_bind_host(host))) != 0 ||
4217             (r = sshpkt_put_u32(ssh, port)) != 0 ||
4218             (r = sshpkt_send(ssh)) != 0)
4219                 fatal_fr(r, "send cancel");
4220
4221         fwd_perm_clear(perm); /* unregister */
4222
4223         return 0;
4224 }
4225
4226 /*
4227  * Request cancellation of remote forwarding of Unix domain socket
4228  * path from local side.
4229  */
4230 static int
4231 channel_request_rforward_cancel_streamlocal(struct ssh *ssh, const char *path)
4232 {
4233         struct ssh_channels *sc = ssh->chanctxt;
4234         struct permission_set *pset = &sc->local_perms;
4235         int r;
4236         u_int i;
4237         struct permission *perm = NULL;
4238
4239         for (i = 0; i < pset->num_permitted_user; i++) {
4240                 perm = &pset->permitted_user[i];
4241                 if (open_listen_match_streamlocal(perm, path))
4242                         break;
4243                 perm = NULL;
4244         }
4245         if (perm == NULL) {
4246                 debug_f("requested forward not found");
4247                 return -1;
4248         }
4249         if ((r = sshpkt_start(ssh, SSH2_MSG_GLOBAL_REQUEST)) != 0 ||
4250             (r = sshpkt_put_cstring(ssh,
4251             "cancel-streamlocal-forward@openssh.com")) != 0 ||
4252             (r = sshpkt_put_u8(ssh, 0)) != 0 || /* want reply */
4253             (r = sshpkt_put_cstring(ssh, path)) != 0 ||
4254             (r = sshpkt_send(ssh)) != 0)
4255                 fatal_fr(r, "send cancel");
4256
4257         fwd_perm_clear(perm); /* unregister */
4258
4259         return 0;
4260 }
4261
4262 /*
4263  * Request cancellation of remote forwarding of a connection from local side.
4264  */
4265 int
4266 channel_request_rforward_cancel(struct ssh *ssh, struct Forward *fwd)
4267 {
4268         if (fwd->listen_path != NULL) {
4269                 return channel_request_rforward_cancel_streamlocal(ssh,
4270                     fwd->listen_path);
4271         } else {
4272                 return channel_request_rforward_cancel_tcpip(ssh,
4273                     fwd->listen_host,
4274                     fwd->listen_port ? fwd->listen_port : fwd->allocated_port);
4275         }
4276 }
4277
4278 /*
4279  * Permits opening to any host/port if permitted_user[] is empty.  This is
4280  * usually called by the server, because the user could connect to any port
4281  * anyway, and the server has no way to know but to trust the client anyway.
4282  */
4283 void
4284 channel_permit_all(struct ssh *ssh, int where)
4285 {
4286         struct permission_set *pset = permission_set_get(ssh, where);
4287
4288         if (pset->num_permitted_user == 0)
4289                 pset->all_permitted = 1;
4290 }
4291
4292 /*
4293  * Permit the specified host/port for forwarding.
4294  */
4295 void
4296 channel_add_permission(struct ssh *ssh, int who, int where,
4297     char *host, int port)
4298 {
4299         int local = where == FORWARD_LOCAL;
4300         struct permission_set *pset = permission_set_get(ssh, where);
4301
4302         debug("allow %s forwarding to host %s port %d",
4303             fwd_ident(who, where), host, port);
4304         /*
4305          * Remote forwards set listen_host/port, local forwards set
4306          * host/port_to_connect.
4307          */
4308         permission_set_add(ssh, who, where,
4309             local ? host : 0, local ? port : 0,
4310             local ? NULL : host, NULL, local ? 0 : port, NULL);
4311         pset->all_permitted = 0;
4312 }
4313
4314 /*
4315  * Administratively disable forwarding.
4316  */
4317 void
4318 channel_disable_admin(struct ssh *ssh, int where)
4319 {
4320         channel_clear_permission(ssh, FORWARD_ADM, where);
4321         permission_set_add(ssh, FORWARD_ADM, where,
4322             NULL, 0, NULL, NULL, 0, NULL);
4323 }
4324
4325 /*
4326  * Clear a list of permitted opens.
4327  */
4328 void
4329 channel_clear_permission(struct ssh *ssh, int who, int where)
4330 {
4331         struct permission **permp;
4332         u_int *npermp;
4333
4334         permission_set_get_array(ssh, who, where, &permp, &npermp);
4335         *permp = xrecallocarray(*permp, *npermp, 0, sizeof(**permp));
4336         *npermp = 0;
4337 }
4338
4339 /*
4340  * Update the listen port for a dynamic remote forward, after
4341  * the actual 'newport' has been allocated. If 'newport' < 0 is
4342  * passed then they entry will be invalidated.
4343  */
4344 void
4345 channel_update_permission(struct ssh *ssh, int idx, int newport)
4346 {
4347         struct permission_set *pset = &ssh->chanctxt->local_perms;
4348
4349         if (idx < 0 || (u_int)idx >= pset->num_permitted_user) {
4350                 debug_f("index out of range: %d num_permitted_user %d",
4351                     idx, pset->num_permitted_user);
4352                 return;
4353         }
4354         debug("%s allowed port %d for forwarding to host %s port %d",
4355             newport > 0 ? "Updating" : "Removing",
4356             newport,
4357             pset->permitted_user[idx].host_to_connect,
4358             pset->permitted_user[idx].port_to_connect);
4359         if (newport <= 0)
4360                 fwd_perm_clear(&pset->permitted_user[idx]);
4361         else {
4362                 pset->permitted_user[idx].listen_port =
4363                     (ssh->compat & SSH_BUG_DYNAMIC_RPORT) ? 0 : newport;
4364         }
4365 }
4366
4367 /* returns port number, FWD_PERMIT_ANY_PORT or -1 on error */
4368 int
4369 permitopen_port(const char *p)
4370 {
4371         int port;
4372
4373         if (strcmp(p, "*") == 0)
4374                 return FWD_PERMIT_ANY_PORT;
4375         if ((port = a2port(p)) > 0)
4376                 return port;
4377         return -1;
4378 }
4379
4380 /* Try to start non-blocking connect to next host in cctx list */
4381 static int
4382 connect_next(struct channel_connect *cctx)
4383 {
4384         int sock, saved_errno;
4385         struct sockaddr_un *sunaddr;
4386         char ntop[NI_MAXHOST];
4387         char strport[MAXIMUM(NI_MAXSERV, sizeof(sunaddr->sun_path))];
4388
4389         for (; cctx->ai; cctx->ai = cctx->ai->ai_next) {
4390                 switch (cctx->ai->ai_family) {
4391                 case AF_UNIX:
4392                         /* unix:pathname instead of host:port */
4393                         sunaddr = (struct sockaddr_un *)cctx->ai->ai_addr;
4394                         strlcpy(ntop, "unix", sizeof(ntop));
4395                         strlcpy(strport, sunaddr->sun_path, sizeof(strport));
4396                         break;
4397                 case AF_INET:
4398                 case AF_INET6:
4399                         if (getnameinfo(cctx->ai->ai_addr, cctx->ai->ai_addrlen,
4400                             ntop, sizeof(ntop), strport, sizeof(strport),
4401                             NI_NUMERICHOST|NI_NUMERICSERV) != 0) {
4402                                 error("connect_next: getnameinfo failed");
4403                                 continue;
4404                         }
4405                         break;
4406                 default:
4407                         continue;
4408                 }
4409                 if ((sock = socket(cctx->ai->ai_family, cctx->ai->ai_socktype,
4410                     cctx->ai->ai_protocol)) == -1) {
4411                         if (cctx->ai->ai_next == NULL)
4412                                 error("socket: %.100s", strerror(errno));
4413                         else
4414                                 verbose("socket: %.100s", strerror(errno));
4415                         continue;
4416                 }
4417                 if (set_nonblock(sock) == -1)
4418                         fatal_f("set_nonblock(%d)", sock);
4419                 if (connect(sock, cctx->ai->ai_addr,
4420                     cctx->ai->ai_addrlen) == -1 && errno != EINPROGRESS) {
4421                         debug("connect_next: host %.100s ([%.100s]:%s): "
4422                             "%.100s", cctx->host, ntop, strport,
4423                             strerror(errno));
4424                         saved_errno = errno;
4425                         close(sock);
4426                         errno = saved_errno;
4427                         continue;       /* fail -- try next */
4428                 }
4429                 if (cctx->ai->ai_family != AF_UNIX)
4430                         set_nodelay(sock);
4431                 debug("connect_next: host %.100s ([%.100s]:%s) "
4432                     "in progress, fd=%d", cctx->host, ntop, strport, sock);
4433                 cctx->ai = cctx->ai->ai_next;
4434                 return sock;
4435         }
4436         return -1;
4437 }
4438
4439 static void
4440 channel_connect_ctx_free(struct channel_connect *cctx)
4441 {
4442         free(cctx->host);
4443         if (cctx->aitop) {
4444                 if (cctx->aitop->ai_family == AF_UNIX)
4445                         free(cctx->aitop);
4446                 else
4447                         freeaddrinfo(cctx->aitop);
4448         }
4449         memset(cctx, 0, sizeof(*cctx));
4450 }
4451
4452 /*
4453  * Return connecting socket to remote host:port or local socket path,
4454  * passing back the failure reason if appropriate.
4455  */
4456 static int
4457 connect_to_helper(struct ssh *ssh, const char *name, int port, int socktype,
4458     char *ctype, char *rname, struct channel_connect *cctx,
4459     int *reason, const char **errmsg)
4460 {
4461         struct addrinfo hints;
4462         int gaierr;
4463         int sock = -1;
4464         char strport[NI_MAXSERV];
4465
4466         if (port == PORT_STREAMLOCAL) {
4467                 struct sockaddr_un *sunaddr;
4468                 struct addrinfo *ai;
4469
4470                 if (strlen(name) > sizeof(sunaddr->sun_path)) {
4471                         error("%.100s: %.100s", name, strerror(ENAMETOOLONG));
4472                         return -1;
4473                 }
4474
4475                 /*
4476                  * Fake up a struct addrinfo for AF_UNIX connections.
4477                  * channel_connect_ctx_free() must check ai_family
4478                  * and use free() not freeaddirinfo() for AF_UNIX.
4479                  */
4480                 ai = xmalloc(sizeof(*ai) + sizeof(*sunaddr));
4481                 memset(ai, 0, sizeof(*ai) + sizeof(*sunaddr));
4482                 ai->ai_addr = (struct sockaddr *)(ai + 1);
4483                 ai->ai_addrlen = sizeof(*sunaddr);
4484                 ai->ai_family = AF_UNIX;
4485                 ai->ai_socktype = socktype;
4486                 ai->ai_protocol = PF_UNSPEC;
4487                 sunaddr = (struct sockaddr_un *)ai->ai_addr;
4488                 sunaddr->sun_family = AF_UNIX;
4489                 strlcpy(sunaddr->sun_path, name, sizeof(sunaddr->sun_path));
4490                 cctx->aitop = ai;
4491         } else {
4492                 memset(&hints, 0, sizeof(hints));
4493                 hints.ai_family = ssh->chanctxt->IPv4or6;
4494                 hints.ai_socktype = socktype;
4495                 snprintf(strport, sizeof strport, "%d", port);
4496                 if ((gaierr = getaddrinfo(name, strport, &hints, &cctx->aitop))
4497                     != 0) {
4498                         if (errmsg != NULL)
4499                                 *errmsg = ssh_gai_strerror(gaierr);
4500                         if (reason != NULL)
4501                                 *reason = SSH2_OPEN_CONNECT_FAILED;
4502                         error("connect_to %.100s: unknown host (%s)", name,
4503                             ssh_gai_strerror(gaierr));
4504                         return -1;
4505                 }
4506         }
4507
4508         cctx->host = xstrdup(name);
4509         cctx->port = port;
4510         cctx->ai = cctx->aitop;
4511
4512         if ((sock = connect_next(cctx)) == -1) {
4513                 error("connect to %.100s port %d failed: %s",
4514                     name, port, strerror(errno));
4515                 return -1;
4516         }
4517
4518         return sock;
4519 }
4520
4521 /* Return CONNECTING channel to remote host:port or local socket path */
4522 static Channel *
4523 connect_to(struct ssh *ssh, const char *host, int port,
4524     char *ctype, char *rname)
4525 {
4526         struct channel_connect cctx;
4527         Channel *c;
4528         int sock;
4529
4530         memset(&cctx, 0, sizeof(cctx));
4531         sock = connect_to_helper(ssh, host, port, SOCK_STREAM, ctype, rname,
4532             &cctx, NULL, NULL);
4533         if (sock == -1) {
4534                 channel_connect_ctx_free(&cctx);
4535                 return NULL;
4536         }
4537         c = channel_new(ssh, ctype, SSH_CHANNEL_CONNECTING, sock, sock, -1,
4538             CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT, 0, rname, 1);
4539         c->host_port = port;
4540         c->path = xstrdup(host);
4541         c->connect_ctx = cctx;
4542
4543         return c;
4544 }
4545
4546 /*
4547  * returns either the newly connected channel or the downstream channel
4548  * that needs to deal with this connection.
4549  */
4550 Channel *
4551 channel_connect_by_listen_address(struct ssh *ssh, const char *listen_host,
4552     u_short listen_port, char *ctype, char *rname)
4553 {
4554         struct ssh_channels *sc = ssh->chanctxt;
4555         struct permission_set *pset = &sc->local_perms;
4556         u_int i;
4557         struct permission *perm;
4558
4559         for (i = 0; i < pset->num_permitted_user; i++) {
4560                 perm = &pset->permitted_user[i];
4561                 if (open_listen_match_tcpip(perm,
4562                     listen_host, listen_port, 1)) {
4563                         if (perm->downstream)
4564                                 return perm->downstream;
4565                         if (perm->port_to_connect == 0)
4566                                 return rdynamic_connect_prepare(ssh,
4567                                     ctype, rname);
4568                         return connect_to(ssh,
4569                             perm->host_to_connect, perm->port_to_connect,
4570                             ctype, rname);
4571                 }
4572         }
4573         error("WARNING: Server requests forwarding for unknown listen_port %d",
4574             listen_port);
4575         return NULL;
4576 }
4577
4578 Channel *
4579 channel_connect_by_listen_path(struct ssh *ssh, const char *path,
4580     char *ctype, char *rname)
4581 {
4582         struct ssh_channels *sc = ssh->chanctxt;
4583         struct permission_set *pset = &sc->local_perms;
4584         u_int i;
4585         struct permission *perm;
4586
4587         for (i = 0; i < pset->num_permitted_user; i++) {
4588                 perm = &pset->permitted_user[i];
4589                 if (open_listen_match_streamlocal(perm, path)) {
4590                         return connect_to(ssh,
4591                             perm->host_to_connect, perm->port_to_connect,
4592                             ctype, rname);
4593                 }
4594         }
4595         error("WARNING: Server requests forwarding for unknown path %.100s",
4596             path);
4597         return NULL;
4598 }
4599
4600 /* Check if connecting to that port is permitted and connect. */
4601 Channel *
4602 channel_connect_to_port(struct ssh *ssh, const char *host, u_short port,
4603     char *ctype, char *rname, int *reason, const char **errmsg)
4604 {
4605         struct ssh_channels *sc = ssh->chanctxt;
4606         struct permission_set *pset = &sc->local_perms;
4607         struct channel_connect cctx;
4608         Channel *c;
4609         u_int i, permit, permit_adm = 1;
4610         int sock;
4611         struct permission *perm;
4612
4613         permit = pset->all_permitted;
4614         if (!permit) {
4615                 for (i = 0; i < pset->num_permitted_user; i++) {
4616                         perm = &pset->permitted_user[i];
4617                         if (open_match(perm, host, port)) {
4618                                 permit = 1;
4619                                 break;
4620                         }
4621                 }
4622         }
4623
4624         if (pset->num_permitted_admin > 0) {
4625                 permit_adm = 0;
4626                 for (i = 0; i < pset->num_permitted_admin; i++) {
4627                         perm = &pset->permitted_admin[i];
4628                         if (open_match(perm, host, port)) {
4629                                 permit_adm = 1;
4630                                 break;
4631                         }
4632                 }
4633         }
4634
4635         if (!permit || !permit_adm) {
4636                 logit("Received request from %.100s port %d to connect to "
4637                     "host %.100s port %d, but the request was denied.",
4638                     ssh_remote_ipaddr(ssh), ssh_remote_port(ssh), host, port);
4639                 if (reason != NULL)
4640                         *reason = SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED;
4641                 return NULL;
4642         }
4643
4644         memset(&cctx, 0, sizeof(cctx));
4645         sock = connect_to_helper(ssh, host, port, SOCK_STREAM, ctype, rname,
4646             &cctx, reason, errmsg);
4647         if (sock == -1) {
4648                 channel_connect_ctx_free(&cctx);
4649                 return NULL;
4650         }
4651
4652         c = channel_new(ssh, ctype, SSH_CHANNEL_CONNECTING, sock, sock, -1,
4653             CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT, 0, rname, 1);
4654         c->host_port = port;
4655         c->path = xstrdup(host);
4656         c->connect_ctx = cctx;
4657
4658         return c;
4659 }
4660
4661 /* Check if connecting to that path is permitted and connect. */
4662 Channel *
4663 channel_connect_to_path(struct ssh *ssh, const char *path,
4664     char *ctype, char *rname)
4665 {
4666         struct ssh_channels *sc = ssh->chanctxt;
4667         struct permission_set *pset = &sc->local_perms;
4668         u_int i, permit, permit_adm = 1;
4669         struct permission *perm;
4670
4671         permit = pset->all_permitted;
4672         if (!permit) {
4673                 for (i = 0; i < pset->num_permitted_user; i++) {
4674                         perm = &pset->permitted_user[i];
4675                         if (open_match(perm, path, PORT_STREAMLOCAL)) {
4676                                 permit = 1;
4677                                 break;
4678                         }
4679                 }
4680         }
4681
4682         if (pset->num_permitted_admin > 0) {
4683                 permit_adm = 0;
4684                 for (i = 0; i < pset->num_permitted_admin; i++) {
4685                         perm = &pset->permitted_admin[i];
4686                         if (open_match(perm, path, PORT_STREAMLOCAL)) {
4687                                 permit_adm = 1;
4688                                 break;
4689                         }
4690                 }
4691         }
4692
4693         if (!permit || !permit_adm) {
4694                 logit("Received request to connect to path %.100s, "
4695                     "but the request was denied.", path);
4696                 return NULL;
4697         }
4698         return connect_to(ssh, path, PORT_STREAMLOCAL, ctype, rname);
4699 }
4700
4701 void
4702 channel_send_window_changes(struct ssh *ssh)
4703 {
4704         struct ssh_channels *sc = ssh->chanctxt;
4705         struct winsize ws;
4706         int r;
4707         u_int i;
4708
4709         for (i = 0; i < sc->channels_alloc; i++) {
4710                 if (sc->channels[i] == NULL || !sc->channels[i]->client_tty ||
4711                     sc->channels[i]->type != SSH_CHANNEL_OPEN)
4712                         continue;
4713                 if (ioctl(sc->channels[i]->rfd, TIOCGWINSZ, &ws) == -1)
4714                         continue;
4715                 channel_request_start(ssh, i, "window-change", 0);
4716                 if ((r = sshpkt_put_u32(ssh, (u_int)ws.ws_col)) != 0 ||
4717                     (r = sshpkt_put_u32(ssh, (u_int)ws.ws_row)) != 0 ||
4718                     (r = sshpkt_put_u32(ssh, (u_int)ws.ws_xpixel)) != 0 ||
4719                     (r = sshpkt_put_u32(ssh, (u_int)ws.ws_ypixel)) != 0 ||
4720                     (r = sshpkt_send(ssh)) != 0)
4721                         fatal_fr(r, "channel %u; send window-change", i);
4722         }
4723 }
4724
4725 /* Return RDYNAMIC_OPEN channel: channel allows SOCKS, but is not connected */
4726 static Channel *
4727 rdynamic_connect_prepare(struct ssh *ssh, char *ctype, char *rname)
4728 {
4729         Channel *c;
4730         int r;
4731
4732         c = channel_new(ssh, ctype, SSH_CHANNEL_RDYNAMIC_OPEN, -1, -1, -1,
4733             CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT, 0, rname, 1);
4734         c->host_port = 0;
4735         c->path = NULL;
4736
4737         /*
4738          * We need to open the channel before we have a FD,
4739          * so that we can get SOCKS header from peer.
4740          */
4741         if ((r = sshpkt_start(ssh, SSH2_MSG_CHANNEL_OPEN_CONFIRMATION)) != 0 ||
4742             (r = sshpkt_put_u32(ssh, c->remote_id)) != 0 ||
4743             (r = sshpkt_put_u32(ssh, c->self)) != 0 ||
4744             (r = sshpkt_put_u32(ssh, c->local_window)) != 0 ||
4745             (r = sshpkt_put_u32(ssh, c->local_maxpacket)) != 0)
4746                 fatal_fr(r, "channel %i; confirm", c->self);
4747         return c;
4748 }
4749
4750 /* Return CONNECTING socket to remote host:port or local socket path */
4751 static int
4752 rdynamic_connect_finish(struct ssh *ssh, Channel *c)
4753 {
4754         struct ssh_channels *sc = ssh->chanctxt;
4755         struct permission_set *pset = &sc->local_perms;
4756         struct permission *perm;
4757         struct channel_connect cctx;
4758         u_int i, permit_adm = 1;
4759         int sock;
4760
4761         if (pset->num_permitted_admin > 0) {
4762                 permit_adm = 0;
4763                 for (i = 0; i < pset->num_permitted_admin; i++) {
4764                         perm = &pset->permitted_admin[i];
4765                         if (open_match(perm, c->path, c->host_port)) {
4766                                 permit_adm = 1;
4767                                 break;
4768                         }
4769                 }
4770         }
4771         if (!permit_adm) {
4772                 debug_f("requested forward not permitted");
4773                 return -1;
4774         }
4775
4776         memset(&cctx, 0, sizeof(cctx));
4777         sock = connect_to_helper(ssh, c->path, c->host_port, SOCK_STREAM, NULL,
4778             NULL, &cctx, NULL, NULL);
4779         if (sock == -1)
4780                 channel_connect_ctx_free(&cctx);
4781         else {
4782                 /* similar to SSH_CHANNEL_CONNECTING but we've already sent the open */
4783                 c->type = SSH_CHANNEL_RDYNAMIC_FINISH;
4784                 c->connect_ctx = cctx;
4785                 channel_register_fds(ssh, c, sock, sock, -1, 0, 1, 0);
4786         }
4787         return sock;
4788 }
4789
4790 /* -- X11 forwarding */
4791
4792 /*
4793  * Creates an internet domain socket for listening for X11 connections.
4794  * Returns 0 and a suitable display number for the DISPLAY variable
4795  * stored in display_numberp , or -1 if an error occurs.
4796  */
4797 int
4798 x11_create_display_inet(struct ssh *ssh, int x11_display_offset,
4799     int x11_use_localhost, int single_connection,
4800     u_int *display_numberp, int **chanids)
4801 {
4802         Channel *nc = NULL;
4803         int display_number, sock;
4804         u_short port;
4805         struct addrinfo hints, *ai, *aitop;
4806         char strport[NI_MAXSERV];
4807         int gaierr, n, num_socks = 0, socks[NUM_SOCKS];
4808
4809         if (chanids == NULL)
4810                 return -1;
4811
4812         for (display_number = x11_display_offset;
4813             display_number < MAX_DISPLAYS;
4814             display_number++) {
4815                 port = 6000 + display_number;
4816                 memset(&hints, 0, sizeof(hints));
4817                 hints.ai_family = ssh->chanctxt->IPv4or6;
4818                 hints.ai_flags = x11_use_localhost ? 0: AI_PASSIVE;
4819                 hints.ai_socktype = SOCK_STREAM;
4820                 snprintf(strport, sizeof strport, "%d", port);
4821                 if ((gaierr = getaddrinfo(NULL, strport,
4822                     &hints, &aitop)) != 0) {
4823                         error("getaddrinfo: %.100s", ssh_gai_strerror(gaierr));
4824                         return -1;
4825                 }
4826                 for (ai = aitop; ai; ai = ai->ai_next) {
4827                         if (ai->ai_family != AF_INET &&
4828                             ai->ai_family != AF_INET6)
4829                                 continue;
4830                         sock = socket(ai->ai_family, ai->ai_socktype,
4831                             ai->ai_protocol);
4832                         if (sock == -1) {
4833                                 if ((errno != EINVAL) && (errno != EAFNOSUPPORT)
4834 #ifdef EPFNOSUPPORT
4835                                     && (errno != EPFNOSUPPORT)
4836 #endif 
4837                                     ) {
4838                                         error("socket: %.100s", strerror(errno));
4839                                         freeaddrinfo(aitop);
4840                                         return -1;
4841                                 } else {
4842                                         debug("x11_create_display_inet: Socket family %d not supported",
4843                                                  ai->ai_family);
4844                                         continue;
4845                                 }
4846                         }
4847                         if (ai->ai_family == AF_INET6)
4848                                 sock_set_v6only(sock);
4849                         if (x11_use_localhost)
4850                                 set_reuseaddr(sock);
4851                         if (bind(sock, ai->ai_addr, ai->ai_addrlen) == -1) {
4852                                 debug2_f("bind port %d: %.100s", port,
4853                                     strerror(errno));
4854                                 close(sock);
4855                                 for (n = 0; n < num_socks; n++)
4856                                         close(socks[n]);
4857                                 num_socks = 0;
4858                                 break;
4859                         }
4860                         socks[num_socks++] = sock;
4861                         if (num_socks == NUM_SOCKS)
4862                                 break;
4863                 }
4864                 freeaddrinfo(aitop);
4865                 if (num_socks > 0)
4866                         break;
4867         }
4868         if (display_number >= MAX_DISPLAYS) {
4869                 error("Failed to allocate internet-domain X11 display socket.");
4870                 return -1;
4871         }
4872         /* Start listening for connections on the socket. */
4873         for (n = 0; n < num_socks; n++) {
4874                 sock = socks[n];
4875                 if (listen(sock, SSH_LISTEN_BACKLOG) == -1) {
4876                         error("listen: %.100s", strerror(errno));
4877                         close(sock);
4878                         return -1;
4879                 }
4880         }
4881
4882         /* Allocate a channel for each socket. */
4883         *chanids = xcalloc(num_socks + 1, sizeof(**chanids));
4884         for (n = 0; n < num_socks; n++) {
4885                 sock = socks[n];
4886                 nc = channel_new(ssh, "x11 listener",
4887                     SSH_CHANNEL_X11_LISTENER, sock, sock, -1,
4888                     CHAN_X11_WINDOW_DEFAULT, CHAN_X11_PACKET_DEFAULT,
4889                     0, "X11 inet listener", 1);
4890                 nc->single_connection = single_connection;
4891                 (*chanids)[n] = nc->self;
4892         }
4893         (*chanids)[n] = -1;
4894
4895         /* Return the display number for the DISPLAY environment variable. */
4896         *display_numberp = display_number;
4897         return 0;
4898 }
4899
4900 static int
4901 connect_local_xsocket_path(const char *pathname)
4902 {
4903         int sock;
4904         struct sockaddr_un addr;
4905
4906         sock = socket(AF_UNIX, SOCK_STREAM, 0);
4907         if (sock == -1)
4908                 error("socket: %.100s", strerror(errno));
4909         memset(&addr, 0, sizeof(addr));
4910         addr.sun_family = AF_UNIX;
4911         strlcpy(addr.sun_path, pathname, sizeof addr.sun_path);
4912         if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) == 0)
4913                 return sock;
4914         close(sock);
4915         error("connect %.100s: %.100s", addr.sun_path, strerror(errno));
4916         return -1;
4917 }
4918
4919 static int
4920 connect_local_xsocket(u_int dnr)
4921 {
4922         char buf[1024];
4923         snprintf(buf, sizeof buf, _PATH_UNIX_X, dnr);
4924         return connect_local_xsocket_path(buf);
4925 }
4926
4927 #ifdef __APPLE__
4928 static int
4929 is_path_to_xsocket(const char *display, char *path, size_t pathlen)
4930 {
4931         struct stat sbuf;
4932
4933         if (strlcpy(path, display, pathlen) >= pathlen) {
4934                 error("%s: display path too long", __func__);
4935                 return 0;
4936         }
4937         if (display[0] != '/')
4938                 return 0;
4939         if (stat(path, &sbuf) == 0) {
4940                 return 1;
4941         } else {
4942                 char *dot = strrchr(path, '.');
4943                 if (dot != NULL) {
4944                         *dot = '\0';
4945                         if (stat(path, &sbuf) == 0) {
4946                                 return 1;
4947                         }
4948                 }
4949         }
4950         return 0;
4951 }
4952 #endif
4953
4954 int
4955 x11_connect_display(struct ssh *ssh)
4956 {
4957         u_int display_number;
4958         const char *display;
4959         char buf[1024], *cp;
4960         struct addrinfo hints, *ai, *aitop;
4961         char strport[NI_MAXSERV];
4962         int gaierr, sock = 0;
4963
4964         /* Try to open a socket for the local X server. */
4965         display = getenv("DISPLAY");
4966         if (!display) {
4967                 error("DISPLAY not set.");
4968                 return -1;
4969         }
4970         /*
4971          * Now we decode the value of the DISPLAY variable and make a
4972          * connection to the real X server.
4973          */
4974
4975 #ifdef __APPLE__
4976         /* Check if display is a path to a socket (as set by launchd). */
4977         {
4978                 char path[PATH_MAX];
4979
4980                 if (is_path_to_xsocket(display, path, sizeof(path))) {
4981                         debug("x11_connect_display: $DISPLAY is launchd");
4982
4983                         /* Create a socket. */
4984                         sock = connect_local_xsocket_path(path);
4985                         if (sock < 0)
4986                                 return -1;
4987
4988                         /* OK, we now have a connection to the display. */
4989                         return sock;
4990                 }
4991         }
4992 #endif
4993         /*
4994          * Check if it is a unix domain socket.  Unix domain displays are in
4995          * one of the following formats: unix:d[.s], :d[.s], ::d[.s]
4996          */
4997         if (strncmp(display, "unix:", 5) == 0 ||
4998             display[0] == ':') {
4999                 /* Connect to the unix domain socket. */
5000                 if (sscanf(strrchr(display, ':') + 1, "%u",
5001                     &display_number) != 1) {
5002                         error("Could not parse display number from DISPLAY: "
5003                             "%.100s", display);
5004                         return -1;
5005                 }
5006                 /* Create a socket. */
5007                 sock = connect_local_xsocket(display_number);
5008                 if (sock < 0)
5009                         return -1;
5010
5011                 /* OK, we now have a connection to the display. */
5012                 return sock;
5013         }
5014         /*
5015          * Connect to an inet socket.  The DISPLAY value is supposedly
5016          * hostname:d[.s], where hostname may also be numeric IP address.
5017          */
5018         strlcpy(buf, display, sizeof(buf));
5019         cp = strchr(buf, ':');
5020         if (!cp) {
5021                 error("Could not find ':' in DISPLAY: %.100s", display);
5022                 return -1;
5023         }
5024         *cp = 0;
5025         /*
5026          * buf now contains the host name.  But first we parse the
5027          * display number.
5028          */
5029         if (sscanf(cp + 1, "%u", &display_number) != 1) {
5030                 error("Could not parse display number from DISPLAY: %.100s",
5031                     display);
5032                 return -1;
5033         }
5034
5035         /* Look up the host address */
5036         memset(&hints, 0, sizeof(hints));
5037         hints.ai_family = ssh->chanctxt->IPv4or6;
5038         hints.ai_socktype = SOCK_STREAM;
5039         snprintf(strport, sizeof strport, "%u", 6000 + display_number);
5040         if ((gaierr = getaddrinfo(buf, strport, &hints, &aitop)) != 0) {
5041                 error("%.100s: unknown host. (%s)", buf,
5042                 ssh_gai_strerror(gaierr));
5043                 return -1;
5044         }
5045         for (ai = aitop; ai; ai = ai->ai_next) {
5046                 /* Create a socket. */
5047                 sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
5048                 if (sock == -1) {
5049                         debug2("socket: %.100s", strerror(errno));
5050                         continue;
5051                 }
5052                 /* Connect it to the display. */
5053                 if (connect(sock, ai->ai_addr, ai->ai_addrlen) == -1) {
5054                         debug2("connect %.100s port %u: %.100s", buf,
5055                             6000 + display_number, strerror(errno));
5056                         close(sock);
5057                         continue;
5058                 }
5059                 /* Success */
5060                 break;
5061         }
5062         freeaddrinfo(aitop);
5063         if (!ai) {
5064                 error("connect %.100s port %u: %.100s", buf,
5065                     6000 + display_number, strerror(errno));
5066                 return -1;
5067         }
5068         set_nodelay(sock);
5069         return sock;
5070 }
5071
5072 /*
5073  * Requests forwarding of X11 connections, generates fake authentication
5074  * data, and enables authentication spoofing.
5075  * This should be called in the client only.
5076  */
5077 void
5078 x11_request_forwarding_with_spoofing(struct ssh *ssh, int client_session_id,
5079     const char *disp, const char *proto, const char *data, int want_reply)
5080 {
5081         struct ssh_channels *sc = ssh->chanctxt;
5082         u_int data_len = (u_int) strlen(data) / 2;
5083         u_int i, value;
5084         const char *cp;
5085         char *new_data;
5086         int r, screen_number;
5087
5088         if (sc->x11_saved_display == NULL)
5089                 sc->x11_saved_display = xstrdup(disp);
5090         else if (strcmp(disp, sc->x11_saved_display) != 0) {
5091                 error("x11_request_forwarding_with_spoofing: different "
5092                     "$DISPLAY already forwarded");
5093                 return;
5094         }
5095
5096         cp = strchr(disp, ':');
5097         if (cp)
5098                 cp = strchr(cp, '.');
5099         if (cp)
5100                 screen_number = (u_int)strtonum(cp + 1, 0, 400, NULL);
5101         else
5102                 screen_number = 0;
5103
5104         if (sc->x11_saved_proto == NULL) {
5105                 /* Save protocol name. */
5106                 sc->x11_saved_proto = xstrdup(proto);
5107
5108                 /* Extract real authentication data. */
5109                 sc->x11_saved_data = xmalloc(data_len);
5110                 for (i = 0; i < data_len; i++) {
5111                         if (sscanf(data + 2 * i, "%2x", &value) != 1) {
5112                                 fatal("x11_request_forwarding: bad "
5113                                     "authentication data: %.100s", data);
5114                         }
5115                         sc->x11_saved_data[i] = value;
5116                 }
5117                 sc->x11_saved_data_len = data_len;
5118
5119                 /* Generate fake data of the same length. */
5120                 sc->x11_fake_data = xmalloc(data_len);
5121                 arc4random_buf(sc->x11_fake_data, data_len);
5122                 sc->x11_fake_data_len = data_len;
5123         }
5124
5125         /* Convert the fake data into hex. */
5126         new_data = tohex(sc->x11_fake_data, data_len);
5127
5128         /* Send the request packet. */
5129         channel_request_start(ssh, client_session_id, "x11-req", want_reply);
5130         if ((r = sshpkt_put_u8(ssh, 0)) != 0 || /* bool: single connection */
5131             (r = sshpkt_put_cstring(ssh, proto)) != 0 ||
5132             (r = sshpkt_put_cstring(ssh, new_data)) != 0 ||
5133             (r = sshpkt_put_u32(ssh, screen_number)) != 0 ||
5134             (r = sshpkt_send(ssh)) != 0 ||
5135             (r = ssh_packet_write_wait(ssh)) != 0)
5136                 fatal_fr(r, "send x11-req");
5137         free(new_data);
5138 }