source: trunk/third/openssh/channels.c @ 22574

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